2017-06-15 10 views
0

この関係を設定しようとしていますが、コードファーストを使用できません。EF6コード1対1ゼロ

EVENT 
Id 
... 
ScheduleId 

SCHEDULE 
Id 
... 
Type 
EventId 

イベントは、常にその日付、場所を確認するスケジュールを持つことになります...しかし、スケジュールは、イベントを持っているかの種類のOSのスケジュールに依存することはできません。スケジュールは異なるタイプでもよく、そのうちの1つはイベントです。タイプがイベントの場合、EventIdフィールドはイベントを指します。

したがって、テーブルの1つがプリンシパルであり、関係のテーブルIDを使用する通常の一対一の関係を作成したくありません。 SQL Serverで

結果がなければならない:だから

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

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

イベントを削除すると、対応するスケジュールが削除されますが、それが「接続」されている場合は、スケジュールを削除することはできませんEventでは、EventId = nullの場合にのみ、これらのスケジュールを削除できます。

私が試してみました:

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

On SCHEDULE 
HasOptional(p => p.Event).WithRequired(m => m.Schedule).WillCascadeOnDelete(true); 
をしかし、それは常にforeingキーとしてEVENT PK IDを取り、それは私が欲しいものではありません。

EFコードを使用して最初にこの設定を行うにはどうすればよいですか?

ありがとうございます。

答えて

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

他の行は必要ありません。

関連する問題