C# 如何防止实体框架在保存更改时向数据库添加引用对象?
我的情况很简单。我有3个对象:C# 如何防止实体框架在保存更改时向数据库添加引用对象?,c#,entity-framework-4,C#,Entity Framework 4,我的情况很简单。我有3个对象: 一个名为TrainingConsultant的对象,尚未保存到数据库中 最近保存到数据库的名为Training的对象及其EntityState是Detatched 最近从数据库加载的名为Consultant的对象及其EntityState已被Detatched 我需要用引用的Consultant和Training保存TrainingConsultant对象,以便在数据库中正确填写所有必填字段和外键 问题是,直到我调用context.TrainingConsul
- 一个名为
的对象,尚未保存到数据库中TrainingConsultant
- 最近保存到数据库的名为
的对象及其Training
是EntityState
Detatched
- 最近从数据库加载的名为
的对象及其Consultant
已被EntityState
Detatched
Consultant
和Training
保存TrainingConsultant
对象,以便在数据库中正确填写所有必填字段和外键
问题是,直到我调用context.TrainingConsultants.AddObject(trainingConsultant)代码>,一切都处于分离状态。此后,training
和consultant
都将其实体状态更改为Added
,因此context.SaveChanges()
在添加trainingconsultant
之前尝试将training
和consultant
添加到数据库中。它失败是因为数据库中已经存在Consultant
,数据库中也存在Consultant
如何解决此问题,使顾问
和培训
都不会保存,但仍会被引用?请记住,我正在代码中的其他地方指定这两个引用对象:
trainingConsultant.Training = training;
trainingConsultant.Consultant = consultant;
因此,在保存任何更改时,都需要我临时保存对象,然后将TrainingConsultant.Training
和TrainingConsultant.Consultant
设置为null
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指定,而不是附加实体:
trainingConsultant.TrainingId = training.Id;
trainingConsultant.ConsultantId = consultant.Id;
context.TrainingConsultants.AddObject(trainingConsultant);
context.SaveChanges();
您可以根据需要进行调整,以匹配您的字段/列名。因此,基本上我需要取消培训、咨询,然后只附加ID?但这会给以后的工作带来不便。它可以工作,将内容保存到数据库中,但现在我有一个对象trainingConsultant
,在Consultant和Training字段中有空值。任何依赖于这些(如ObjectListView)的操作都会失败。那么,我是否应该在保存后重新访问它们,并始终在保存前对其进行重新跟踪(仅分配ID)?在调用SaveChanges()
后,通过调用context.TrainingConsultants.Load()
尝试刷新上下文,因此基本上我需要取消培训,然后附上身份证?但这会给以后的工作带来不便。它可以工作,将内容保存到数据库中,但现在我有一个对象trainingConsultant
,在Consultant和Training字段中有空值。任何依赖于这些(如ObjectListView)的操作都会失败。因此,我是否应该在保存后重新访问它们,并始终在保存前对它们进行重新跟踪(仅分配ID)?在调用SaveChanges()
后,通过调用context.TrainingConsultants.Load()