C# 具有相同类型的两个实例的实体关系

C# 具有相同类型的两个实例的实体关系,c#,entity-framework,orm,entity-framework-5,change-tracking,C#,Entity Framework,Orm,Entity Framework 5,Change Tracking,我有以下型号: 在数据库中,假设我有一个用户管理员和一个由该用户管理员创建和修改的工件 下面的代码不起作用,我想知道到底发生了什么,我怎样才能使它起作用? 重要提示:当工件由不同的用户创建/编辑时,它就像一个符咒一样工作。 using (var context = new ModelEntities()) { //Get an artifact created and edited by the user Administrator var artifact = contex

我有以下型号:

在数据库中,假设我有一个用户管理员和一个由该用户管理员创建和修改的工件

下面的代码不起作用,我想知道到底发生了什么,我怎样才能使它起作用? 重要提示:当工件由不同的用户创建/编辑时,它就像一个符咒一样工作。

using (var context = new ModelEntities())
{
    //Get an artifact created and edited by the user Administrator
    var artifact = context.Artifact
                          .AsNoTracking()
                          .First(a => a.Name == "Artifact created/edited by the same user");

    var createdUser = artifact.CreatedBy;
    Console.WriteLine("{0} created.", createdUser.Name); // Administrator created.

    var modifiedUser = artifact.ModifiedBy;
    Console.WriteLine("{0} modified.", modifiedUser.Name); // Administrator modified.

    context.Set<Artifact>().Attach(artifact); // **Exception! An object with the same key already exists in the ObjectStateManager. The ObjectStateManager cannot track multiple objects with the same key.**

    artifact.Name = "New Name";

    context.Entry(artifact).State = EntityState.Modified;
    context.SaveChanges();
}
使用(var-context=new-modeleentities())
{
//获取由用户管理员创建和编辑的工件
var artifact=context.artifact
.AsNoTracking()
.First(a=>a.Name==“由同一用户创建/编辑的工件”);
var createdUser=artifact.CreatedBy;
Console.WriteLine(“{0}已创建。”,createdUser.Name);//已创建管理员。
var modifiedUser=artifact.ModifiedBy;
Console.WriteLine(“{0}已修改。”,modifiedUser.Name);//管理员已修改。
context.Set().Attach(工件);//**异常!ObjectStateManager中已存在具有相同键的对象。ObjectStateManager无法跟踪具有相同键的多个对象**
artifact.Name=“新名称”;
context.Entry(artifact.State=EntityState.Modified;
SaveChanges();
}
在两个不同的导航属性中有两个相同类型的实体似乎是实体框架的限制


请注意,我已尝试尽可能简单地创建此示例,删除了业务规则通常需要的明显字段(如创建和修改的日期时间)。

(+1),因为我不明白为什么会发生这种情况。使用AsNoTracking()有什么原因吗?我不确定如果您将数据保存回数据库,是否会有多大好处。在删除AsNoTracking并只调用SaveChanges而不使用Attach之后,如果问题消失了,这将是一件很有趣的事情。虽然它不能解释太多问题本身,是吗?AsNoTracking有很多地方。例如,如果没有AsNoTracking,当对象缓存有太多的实体需要处理时,就会出现性能问题。如果在“var artifact=”之前调用context.Set().AsNoTracking(),并保持其他内容与发布的代码相同,会怎么样?它在没有asnotrack的情况下工作的原因是,它一直跟踪您正在修改的工件就是您提取的工件。您收到的错误是,出于某种原因(可能是AsNoTracking的位置),它认为您正在添加具有相同名称的新条目。更正—“name”应为“key”。此链接也可能有帮助: