2017-06-15 92 views
0

我試圖配置這種關係,但是我不能使用Code First。EF6 Code First One to One-Zero

EVENT 
Id 
... 
ScheduleId 

SCHEDULE 
Id 
... 
Type 
EventId 

的事件將永遠有一個時間表,看看它的日期,地點......但時間表可以有一個事件或不依賴於操作系統類型時間表。時間表可以是不同的類型,其中之一是事件。當類型是事件時,EventId字段將指向事件。

所以,我不想創建一個常規的一對一關係,其中一個表是主體,我們使用表Id作爲關係。

在SQL Server中的結果必須是:

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

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

所以,當你刪除事件,相應的調度將被刪除,但如果它被「附加」你不能刪除時間表一個Event,你只能刪除那些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); 

但它始終把事件PK ID作爲foreing鍵,這不是我想要的。

如何使用EF Code First實現此配置?

在此先感謝。

回答

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); 

不需要其他線路。