Entity Framework AddOrUpdate 未在更新时设置 FK 值
Entity Framework AddOrUpdate not setting FK value on update
我继承了一个在 Migrations Seed() 过程中使用 EF 6.2 和 AddOrUpdate 方法的项目。
在干净的数据库中,这段代码工作得很好。但是,一旦有数据,更新片段就会给我带来问题。
我们添加如下所示的新模板。然后我们将模板添加到 Event.Templates 集合中。在 ADD 版本中,从一个干净的数据库或没有数据库开始,这会按预期填充 Template.Event_Id 外键值。
但是在更新期间,一旦存在事件和模板,它就会添加新模板但将 Event_ID 保留为空。我还检查了其他示例,这些示例似乎有效,或者有人可能在事后手动编辑了数据库。
知道为什么要这样做吗?
Template NbCaseConfirmationCarrierSubmissionAppTemplate = new Template
{
NotificationType = "app",
TemplateName = "NB Case Confirmation of Carrier Submission App Template",
TemplateSubject = @"@Model.EventData.CompanyName's enrollment has been submitted to @Model.EventData.CaseCarrier",
TemplateBody = @"",
JsonPayload = @"",
TemplateHistory = new List<TemplateHistory>()
};
context.Templates.AddOrUpdate(x => x.TemplateName, NbCaseConfirmationCarrierSubmissionAppTemplate);
Event NbCaseConfirmationCarrierSubmissionEvent = new Event
{
EventType = "NbCaseConfirmationCarrierSubmission",
Description = "NB Case Confirmation Carrier Submission",
ProgramId = "BM_CASE_CONFIRMATION_CARRIER_SUBMISSION_NOTICE",
NotifySalesforce = true,
Templates = new List<Template>
{
NbCaseConfirmationCarrierSubmissionEmailTemplate,
NbCaseConfirmationCarrierSubmissionAppTemplate
}
};
context.Events.AddOrUpdate(x => x.EventType, NbCaseConfirmationCarrierSubmissionEvent);
我终于找到问题了。核心问题是他们构建的实体 classes 足以让数据库正确构建,但他们没有在模板 class.
上包含 FK 对象或 ID
我必须将以下内容添加到模板 class:
public virtual Event Event { get; set; }
[Column("Event_Id")]
public int? EventId { get; set; }
然后我必须将以下内容添加到数据库上下文 OnModelCreating 方法中:
modelBuilder.Entity<Template>()
.HasRequired(x => x.Event)
.WithMany(x => x.Templates)
.HasForeignKey(x => x.EventId);
然后我不得不重新安排我在问题中发布的代码以在模板之前添加或更新事件,删除 Event.Templates 中的条目并将值分配给 Template.EventId.
我继承了一个在 Migrations Seed() 过程中使用 EF 6.2 和 AddOrUpdate 方法的项目。
在干净的数据库中,这段代码工作得很好。但是,一旦有数据,更新片段就会给我带来问题。
我们添加如下所示的新模板。然后我们将模板添加到 Event.Templates 集合中。在 ADD 版本中,从一个干净的数据库或没有数据库开始,这会按预期填充 Template.Event_Id 外键值。
但是在更新期间,一旦存在事件和模板,它就会添加新模板但将 Event_ID 保留为空。我还检查了其他示例,这些示例似乎有效,或者有人可能在事后手动编辑了数据库。
知道为什么要这样做吗?
Template NbCaseConfirmationCarrierSubmissionAppTemplate = new Template
{
NotificationType = "app",
TemplateName = "NB Case Confirmation of Carrier Submission App Template",
TemplateSubject = @"@Model.EventData.CompanyName's enrollment has been submitted to @Model.EventData.CaseCarrier",
TemplateBody = @"",
JsonPayload = @"",
TemplateHistory = new List<TemplateHistory>()
};
context.Templates.AddOrUpdate(x => x.TemplateName, NbCaseConfirmationCarrierSubmissionAppTemplate);
Event NbCaseConfirmationCarrierSubmissionEvent = new Event
{
EventType = "NbCaseConfirmationCarrierSubmission",
Description = "NB Case Confirmation Carrier Submission",
ProgramId = "BM_CASE_CONFIRMATION_CARRIER_SUBMISSION_NOTICE",
NotifySalesforce = true,
Templates = new List<Template>
{
NbCaseConfirmationCarrierSubmissionEmailTemplate,
NbCaseConfirmationCarrierSubmissionAppTemplate
}
};
context.Events.AddOrUpdate(x => x.EventType, NbCaseConfirmationCarrierSubmissionEvent);
我终于找到问题了。核心问题是他们构建的实体 classes 足以让数据库正确构建,但他们没有在模板 class.
上包含 FK 对象或 ID我必须将以下内容添加到模板 class:
public virtual Event Event { get; set; }
[Column("Event_Id")]
public int? EventId { get; set; }
然后我必须将以下内容添加到数据库上下文 OnModelCreating 方法中:
modelBuilder.Entity<Template>()
.HasRequired(x => x.Event)
.WithMany(x => x.Templates)
.HasForeignKey(x => x.EventId);
然后我不得不重新安排我在问题中发布的代码以在模板之前添加或更新事件,删除 Event.Templates 中的条目并将值分配给 Template.EventId.