如何防止实体框架中的SaveChanges尝试向数据库中添加引用对象

如何防止实体框架中的SaveChanges尝试向数据库中添加引用对象

问题描述:

我的情况相当简单。我有3对象:如何防止实体框架中的SaveChanges尝试向数据库中添加引用对象

  • 对象称为TrainingConsultant还未被保存到数据库
  • 对象称为Training最近被保存到数据库和它的EntityStateDetatched
  • 最近从数据库加载的一个名为'Consultant'的对象,它的EntityStateDetatched

我需要保存与TrainingConsultant对象引用ConsultantTraining,这样在数据库中的所有必填字段和外键填写正确。

问题是,直到我拨打context.TrainingConsultants.AddObject(trainingConsultant);一切都处于分离状态。之后,培训和顾问都将其EntityState更改为已添加,因此context.SaveChanges()尝试在添加traingingConsultant之前将trainingconsultant都添加到数据库中。它失败了,因为Consultant已经存在于数据库中,所以`顾问。

我该如何解决这个问题,以便顾问和培训都不会被保存,但仍然被引用?请记住,我在代码分配的2个引用的对象别处:

trainingConsultant.Training = training; 
trainingConsultant.Consultant = consultant; 

因此,当涉及到保存任何改变都需要我救对象临时,然后设置null.Training.ConsultantTrainingConsultant对象?

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(); 

您可以根据需要调节,以满足你的领域/列名。

+0

所以基本上我需要去空白培训,顾问,然后只是附加ID的? – MadBoy 2012-02-01 21:58:10

+0

但以后会让事情变得不方便。它的工作原理,保存到数据库的东西,但现在我有一个对象'trainingConsultant'在Consultant和Training字段中有空值。任何依赖这些的东西(比如ObjectListView失败)。那么我应该在保存之后重新保存它们,并且在保存之前始终对它们进行分解(仅分配ID)? – MadBoy 2012-02-01 22:13:11

+0

通过调用'context.TrainingConsultants.Load()'调用'SaveChanges()'后尝试刷新上下文。 – lukiffer 2012-02-01 23:31:32