如何防止实体框架中的SaveChanges尝试向数据库中添加引用对象
问题描述:
我的情况相当简单。我有3
对象:如何防止实体框架中的SaveChanges尝试向数据库中添加引用对象
- 对象称为
TrainingConsultant
还未被保存到数据库 - 对象称为
Training
最近被保存到数据库和它的EntityState
是Detatched
。 - 最近从数据库加载的一个名为'Consultant'的对象,它的
EntityState
是Detatched
。
我需要保存与TrainingConsultant
对象引用Consultant
和Training
,这样在数据库中的所有必填字段和外键填写正确。
问题是,直到我拨打context.TrainingConsultants.AddObject(trainingConsultant);
一切都处于分离状态。之后,培训和顾问都将其EntityState更改为已添加,因此context.SaveChanges()
尝试在添加traingingConsultant
之前将training
和consultant
都添加到数据库中。它失败了,因为Consultant
已经存在于数据库中,所以`顾问。
我该如何解决这个问题,以便顾问和培训都不会被保存,但仍然被引用?请记住,我在代码分配的2个引用的对象别处:
trainingConsultant.Training = training;
trainingConsultant.Consultant = consultant;
因此,当涉及到保存任何改变都需要我救对象临时,然后设置null
到.Training
.Consultant
在TrainingConsultant
对象?
using (var context = new Entity(Settings.sqlDataConnectionDetails)) {
context.TrainingConsultants.AddObject(trainingConsultant);
context.SaveChanges();
}
答
你应该只由ID指定,而不是附加的实体:
trainingConsultant.TrainingId = training.Id;
trainingConsultant.ConsultantId = consultant.Id;
context.TrainingConsultants.AddObject(trainingConsultant);
context.SaveChanges();
您可以根据需要调节,以满足你的领域/列名。
所以基本上我需要去空白培训,顾问,然后只是附加ID的? – MadBoy 2012-02-01 21:58:10
但以后会让事情变得不方便。它的工作原理,保存到数据库的东西,但现在我有一个对象'trainingConsultant'在Consultant和Training字段中有空值。任何依赖这些的东西(比如ObjectListView失败)。那么我应该在保存之后重新保存它们,并且在保存之前始终对它们进行分解(仅分配ID)? – MadBoy 2012-02-01 22:13:11
通过调用'context.TrainingConsultants.Load()'调用'SaveChanges()'后尝试刷新上下文。 – lukiffer 2012-02-01 23:31:32