Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework 在添加包含第一个对象的对象时,如何防止EF插入数据库中已经存在的对象?_Entity Framework_Insert_Ef Code First - Fatal编程技术网

Entity framework 在添加包含第一个对象的对象时,如何防止EF插入数据库中已经存在的对象?

Entity framework 在添加包含第一个对象的对象时,如何防止EF插入数据库中已经存在的对象?,entity-framework,insert,ef-code-first,Entity Framework,Insert,Ef Code First,这很能自我解释。 我有一个类包含另一个类 让我们称之为学科和课堂 public class Subject { public Classroom Class {get; set;} } 我使用的是无状态facades,这意味着我的DbContext在恢复对象之后立即被释放,并被创建来存储新对象。 它不应该知道教室不是一个新对象,因为它的ID已经在数据库中了吗? 使用调试器,我可以跟踪到调用SaveChanges方法之前的某个点,并且我在数据库中拥有的是教室id。 有什么问题吗?EF添加了

这很能自我解释。 我有一个类包含另一个类 让我们称之为学科和课堂

public class Subject
{
   public Classroom Class {get; set;}
}
我使用的是无状态facades,这意味着我的DbContext在恢复对象之后立即被释放,并被创建来存储新对象。 它不应该知道教室不是一个新对象,因为它的ID已经在数据库中了吗? 使用调试器,我可以跟踪到调用SaveChanges方法之前的某个点,并且我在数据库中拥有的是教室id。 有什么问题吗?EF添加了一个新教室,其属性与前一个教室相同,但具有新的PK。 我做错了什么

这是用于常规CRUD操作(它们在my 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();
    }

如果看不到您是如何更新或创建
主题
实体的实际代码,就很难判断。但是,您可能没有连接教室,因此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应该知道该Id不是新的Id。但再次感谢你。