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。但再次感谢你。