【问题标题】:How can I prevent EF from inserting an object that already exists in the db when adding one that contains this first one?添加包含第一个对象的对象时,如何防止 EF 插入数据库中已存在的对象?
【发布时间】:2012-10-21 23:45:38
【问题描述】:

这是不言自明的。 我有一个包含另一个的类 我们称它们为主题和教室

public class Subject
{
   public Classroom Class {get; set;}
}

我正在使用无状态外观,这意味着我的 DbContext 在恢复对象后立即被释放,并被创建用于存储新对象。 它不应该知道 Classroom 不是一个新对象,因为它的 ID 已经在数据库中了吗? 使用调试器,我可以在调用 SaveChanges 方法之前跟踪到该点,而 Classroom.id 是我在数据库中拥有的那个。 有什么问题? EF 添加了一个新的 Classroom,其属性与之前的完全相同,但有一个新的 PK。 我在这里做错了什么?

这是用于一般 CRUD 操作的代码(它们在我的 DbContext 中)更新和删除都可以正常工作:

    public void Update(DbSet MySet, object Obj)
    {
        MySet.Attach(Obj);
        var Entry = this.Entry(Obj);
        Entry.State = EntityState.Modified;
        this.SaveChanges();
    }


    public void Insert(DbSet MySet, object Obj)
    {
        MySet.Add(Obj);
        this.SaveChanges();
    }


    public void Delete(DbSet MySet, object Obj)
    {
        MySet.Attach(Obj);
        var Entry = this.Entry(Obj);
        Entry.State = EntityState.Deleted;
        this.SaveChanges();
    }

【问题讨论】:

    标签: entity-framework insert ef-code-first


    【解决方案1】:

    如果没有看到关于如何更新或创建Subject 实体的实际代码,很难说清楚。但是,您可能没有附加 Classroom,因此 EF 假设实体是新的,而实际上并非如此。

         using (Model m = new Model())
         {
            m.Subject.Add(subject);
            m.Classrooms.Attach(subject.Class);
            m.SaveChanges();           
         }
    

    即使 PK 相同,但不附加到上下文,EF 也无法弄清楚您的意图是什么。附加实体明确告诉您的上下文您想要什么。

    【讨论】:

    • 谢谢,这可能有用!我使用了类似的代码,但我定义了一个通用方法来插入我的实体,采用通用对象: public void Insert (DataSet dSet,object obj) { dSet.Add(obj); this.SaveChanges();所以我想这种匿名状态没有办法做到这一点
    • 它正在添加外键但强制插入...我希望它只是保留外键
    • 谢谢,工作。这很烦人。如果模型有一个 Id,EF 应该知道这不是一个新的。但再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多