EF6 Code First One to One-Zero

时间:2017-06-15 08:59:47

标签: entity-framework ef-code-first code-first

我正在尝试配置此关系,但我无法使用Code First。

EVENT
Id
...
ScheduleId

SCHEDULE
Id
...
Type
EventId

一个事件总是有一个时间表来查看它的日期,地点......但是一个时间表可以有一个或多个事件,具体取决于类型os时间表。时间表可以是不同类型,其中之一是事件。当类型为事件时,字段EventId将指向事件。

所以我不想创建一个常规的一对一关系,其中一个表是主体,我们使用表Id来表示关系。

在SQL Server中,结果必须是:

EVENT
FK Event.ScheduleId -> Schedule.Id -> OnDelete NO Action

SCHEDULE
FK Schedule.EventId -> Event.Id -> OnDelete Cascade

因此,当您删除EVENT时,相应的SCHEDULE将被删除,但如果它“附加”到一个事件,则无法删除SCHEDULE,您只能删除EventId = null的那些SCHEDULES。

我试过了:

On EVENT 
HasRequired(p => p.Schedule).WithOptional(a => a.Event).WillCascadeOnDelete(false)

On SCHEDULE
HasOptional(p => p.Event).WithRequired(m => m.Schedule).WillCascadeOnDelete(true);

但它始终将EVENT PK Id作为前导键,而这不是我想要的。

如何使用EF Code First实现此配置?

提前致谢。

1 个答案:

答案 0 :(得分:0)

在审核了很多帖子后,我找到了解决方案。

EVENT
Id
...
ScheduleId -> NO
Schedule (Navigation property)

SCHEDULE
Id
...
Type
EventId -> NO
Event (Navigation property)

选项:

HasOptional(x => x.Schedule).WithOptionalPrincipal().Map(x => x.MapKey("EventId")).WillCascadeOnDelete(true);

HasOptional(x => x.Event).WithOptionalPrincipal().Map(x => x.MapKey("ScheduleId"));

我希望有人发现这很有趣,可以解决任何类似情况。

已更新

事实上,我们只需要以下内容,因为EF会处理这种关系。

HasOptional(x => x.Schedule).WithOptionalPrincipal(p => p.Event).Map(x => x.MapKey("EventId")).WillCascadeOnDelete(true);

不需要另一条线。