C# 如何防止实体框架在保存更改时向数据库添加引用对象?

C# 如何防止实体框架在保存更改时向数据库添加引用对象?,c#,entity-framework-4,C#,Entity Framework 4,我的情况很简单。我有3个对象: 一个名为TrainingConsultant的对象,尚未保存到数据库中 最近保存到数据库的名为Training的对象及其EntityState是Detatched 最近从数据库加载的名为Consultant的对象及其EntityState已被Detatched 我需要用引用的Consultant和Training保存TrainingConsultant对象,以便在数据库中正确填写所有必填字段和外键 问题是,直到我调用context.TrainingConsul

我的情况很简单。我有3个对象:

  • 一个名为
    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()