在EF Code First中添加分离的对象并跳过依赖对象

时间:2013-12-02 12:23:40

标签: c# entity-framework ef-code-first code-first

目标是将分离的根对象添加到数据库并跳过添加依赖子对象。我试图调用dbSetRoot.Add(root)方法将根对象附加到上下文。并将Child对象的状态设置为Unchanged以在SaveChange上跳过此对象。

public class Root
{
    [System.ComponentModel.DataAnnotations.Key]
    public int ID { get; set; }
    public string Name { get; set; }
    public IList<Child> Childs { get; set; }
}
public class Child
{
    [System.ComponentModel.DataAnnotations.Key]
    public int ID { get; set; }
    public int RootID { get; set; }
    public string Name { get; set; }
}

代码

 // Prepare data to save
        Root root = new Root()
        {
            Name = DateTime.Now.ToLongTimeString()
        };
        root.Childs = new List<Child>();
        root.Childs.Add(new Child()
        {
            Name = DateTime.Now.ToLongTimeString()
        });

        // Save to DB
        using (TasksDbContext dbContext = new TasksDbContext())
        {
            DbSet dbSetRoot = dbContext.Set<Root>();                
            dbSetRoot.Add(root);
            dbContext.Entry(root.Childs[0]).State = System.Data.EntityState.Unchanged;
            dbContext.SaveChanges(); // exception is here
        }

此代码抛出异常&#34;发生了引用完整性约束违规:定义引用约束的属性值在关系中的主体和从属对象之间不一致。&#34;在SaveChanges()方法。

1 个答案:

答案 0 :(得分:0)

您已使用新运算符创建Child,其ID将为'0'。

然后你已经将它添加到Root,并告诉上下文它是不变的。

所以现在您正在尝试保存链接到ID为0的Root的{​​{1}}对象,但数据库中不存在该子项,因此您将获得参照完整性约束违规。