[英]EF Core cannot update entity with two navigation properties to same object (other entity)
我有两张桌子。 用户表具有到另一个(相同)实体的两个链接,即语言:
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public Language OrigLanguage { get; set; }
public Language Language { get; set; }
}
public class Language
{
public int Id { get; set; }
public string Name { get; set; }
}
EF会正确创建表:
表“用户”:Id,FirstName,LastName,LanguageId,OrigLanguageId
我可以为用户添加具有相同值的OrigLanguage和Language,而不会出现任何问题。 一旦我尝试更新具有相同值的现有用户,就会收到以下错误消息:
InvalidOperationException:无法跟踪实体类型“ Language”的实例,因为已经跟踪了另一个键值为“ {Id:1}”的实例。 附加现有实体时,请确保仅附加一个具有给定键值的实体实例。
具有以下堆栈:
Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.ThrowIdentityConflict(InternalEntityEntry条目)Microsoft.EntityFrameworkCore.ChangeTracking.Internal.IdentityMap.Add(TKey键,InternalEntityEntry条目,布尔更新副本)Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.StartTracking(InternalEntityEntry条目) )。 .EntityGraphAttacher.PaintAction(EntityEntryGraphNode节点,强制)Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode节点,TState状态,Func handleNode)Microsoft.EntityFrameworkCore.ChangeTracking.Inter nal.EntityEntryGraphIterator.TraverseGraph(EntityEntryGraphNode节点,TState状态,Func handleNode)Microsoft.EntityFrameworkCore.ChangeTracking.Internal.EntityGraphAttacher.AttachGraph(InternalEntityEntry rootEntry,EntityState实体状态,bool forceStateWhenUnknownKey)Microsoft.EntityFrameworkCore.DbContext.SetEntityState(InternalEntity) Microsoft.EntityFrameworkCore.DbContext.SetEntityState(TEntity实体,EntityState实体状态)Microsoft.EntityFrameworkCore.DbContext.Attach(TEntity实体)Repository.cs中的Namespace.Data.Repository.UpdateAsync(T实体)
在我的Startup.cs中,我具有以下设置来防止跟踪:
services.AddDbContext<DocLogDBContext>(
options => options.UseSqlServer(...)
.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking)
在我的存储库中,我需要更新以下代码:
public override async Task<User> UpdateAsync(User entity)
{
// below two detachments have no effect
_context.Attach(entity.OrigLanguage).State = EntityState.Detached;
_context.Attach(entity.Language).State = EntityState.Detached;
_context.Attach(entity).State = EntityState.Modified;
await _context.SaveChangesAsync();
return entity;
}
我的API控制器如下所示:
[HttpPost]
public virtual async Task<IActionResult> Edit(T model)
{
await _repository.UpdateAsync(model);
return Ok(model);
}
这是来自客户端的请求:
Request URL: https://localhost:44344/api/User/Edit
Request Payload:
{
Id: 3
, FirstName: "Joe"
, LastName: "Frazer"
, Language: { Name: "english", ShortName: "en", Id: 1 }
, OrigLanguage: { Name: "english", ShortName: "en", Id: 1 }
}
我在这里想念什么?
我们可以通过在poco类上使用“ [ForeignKey(“ xxxxx”)]”属性来解决问题。 在这里,我尝试更正以下代码:
public class User
{
public int Id { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
[ForeignKey("OrigLanguage")]
public int OrigLanguageId { get; set; }
[ForeignKey("Language")]
public int LanguageId { get; set; }
public Language OrigLanguage { get; set; }
public Language Language { get; set; }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.