C# 向数据库添加多级实体(代码优先)

C# 向数据库添加多级实体(代码优先),c#,entity-framework,C#,Entity Framework,我想在数据库中创建一个新记录,但问题是多级引用 我有以下资料: [Serializable] public class CodeInfo { public Guid CodeId { get; set; } public string Value get; set; } } var person = new Person(); person.Name = "Jane"; person.Code = new Code(); person.Code = "existingCode"

我想在数据库中创建一个新记录,但问题是多级引用

我有以下资料:

[Serializable]
public class CodeInfo
{
    public Guid CodeId { get; set; }
    public string Value get; set; }
}
var person = new Person();
person.Name = "Jane";
person.Code = new Code();
person.Code = "existingCode";
Context.Person.Attach(person);
Context.Entry(person).State = EntityState.Added;
Context.SaveChanges;

我遇到的情况是,我首先用如下代码更新一个人:

var person = p.GetPerson(1234);
person.Name = "Jane";
Context.Person.Attach(person);
Context.Entry(person).State = EntityState.Modified;
Context.SaveChanges;
这很好用

当我执行以下操作时:

[Serializable]
public class CodeInfo
{
    public Guid CodeId { get; set; }
    public string Value get; set; }
}
var person = new Person();
person.Name = "Jane";
person.Code = new Code();
person.Code = "existingCode";
Context.Person.Attach(person);
Context.Entry(person).State = EntityState.Added;
Context.SaveChanges;
当我以前没有做过更新时,这也非常有效。当我同时执行这两个命令时,我得到一个错误:

附加“Model.CodeInfo”类型的实体失败,因为另一个实体 相同类型的实体已具有相同的主键值。这 在使用“附加”方法或设置 如果图形中的任何实体已更改,则将实体更改为“未更改”或“已修改” 相互冲突的键值。这可能是因为一些实体是新的和 尚未收到数据库生成的键值。在这种情况下,请使用 “添加”方法或“添加”实体状态来跟踪图形和 然后将非新实体的状态设置为“未更改”或“已修改”,如下所示 合适

也试过

 Context.Person.Add(person);
但这会导致同样的错误,entity framework试图在数据库中创建一个CodeInfo,但我只想在对象中创建一个关系

如何解决这个问题


…代码当然简化了…

person.code=newcode()
person.code=“existingCode”
这是个问题。现在将CodeId添加到person类中,但我诚实地认为它不是很干净,但它解决了问题。我希望EF更聪明一点。