如何解决如何在 EF Core 中使用 C# 9 记录?
我正在使用 ASP.NET Core 5 Web API,并且我正在尝试使用新的 C# records 作为我的模型类。但是,每当我使用 with
表达式更新修改后的模型时,都会收到有关跟踪问题的 EF Core 错误:
System.InvalidOperationException: The instance of entity type 'Product' cannot be
tracked because another instance with the key value '{ID: 2}' is already being
tracked. When attaching existing entities,ensure that only one entity instance
with a given key value is attached.
我相信这是由于“变异”记录如何创建新的对象实例而 EF Core 的跟踪系统不喜欢这样,但我不确定修复它的最佳方法。有人有什么建议吗?或者我应该回到使用常规课程而不是记录?
这是重现问题的片段:
// Models/Product.cs
public record Product(int ID,string Name);
// Controllers/ProductController.cs
[HttpGet("test/{id}")]
public async Task<Product> ExampleControllerAction(int id,CancellationToken cancellationToken)
{
string newName = "test new name!!";
Product product = await db.Products.FindAsync(new object[] { id },cancellationToken);
product = product with { Name = newName }; // Modify the model.
db.Update(product); // InvalidOperationException happens here.
await db.SaveChangesAsync(cancellationToken);
return product;
}
解决方法
如果您关闭 EF 更改跟踪,它应该可以正常工作。尝试将 AsNoTracking()
添加到原始数据库调用中。另外,我知道这会比回答更好,但 SO 完全倒退了权限,并将评论限制在 50 分以下,但允许回答。
Entity Framework Core 依赖引用相等来确保它 仅使用实体类型的一个实例来表示概念上的一个 实体。因此,记录类型不适合用作 Entity Framework Core 中的实体类型。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。