我正在尝试配置此关系,但我无法使用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实现此配置?
提前致谢。
答案 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);
不需要另一条线。