2017-05-24 13 views
0

2つのエンティティ間に1対1の関係を確立しようとしていますが、共有キーではなく、独自のインデント列を含みます。EFコード - 共有PK/FKなしで1対0の関係を設定する

私は明示的に明示的な宣言(そう、不要データ注釈や流暢API条項なし)を必要としないものを宣言する規則を次のようではなく、可能な限りやりたい

entites:

public class File 
{ 
    public int FileId {get;set;} 
    //some omitted file properties 
    public virtual Task Task {get;set;} 
} 

public class Task 
{ 
    public int TaskId {get;set;} 
    //some omitted task properties 
    public int FileId {get;set;} 
    public virtual File File {get;set;} 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<File>().HasOptional(f => f.Task).WithRequired(t => t.File); 
      base.OnModelCreating(modelBuilder); 
     } 

これは、TaskIdがTasksテーブルのPK列とFK列の両方である奇妙な関係を作成します。どちらが、ファイルIDと同じ値を持つべきだと思いますか? (それは質問です:)

私はどのようにTaskIdに独自の連続値を保持させ、FileIdをFilesテーブルの外部キーにするのですか?

1-0..1の場合、TaskIdプロパティを取り除き、FileIdをPK/FKプロパティにする必要がありますか?

乾杯!

答えて

2

双方向one-to-one明示的FKプロパティとの関係はサポートされていません。

したがって、現在持っているものを使用し続けるか - Shared Primary Key associationTaskIdまたはFileIdのいずれかのプロパティーをTaskから取り除き、残りの部分をPKにしてください(デフォルトのEF one-to-one関係モデルであるため、EFは自動的にFKとしてFKを使用します)。

またはTaskからFieldIdプロパティを取り除くと、次の流暢な設定を使用します(すべてが必要です):

modelBuilder.Entity<File>() 
    .HasOptional(f => f.Task) 
    .WithRequired(t => t.File) 
    .Map(m => m.MapKey("FileId")) 
    .WillCascadeOnDelete(); 

しかし、やっていないのは、特別な理由がない場合、私は(最初のアプローチを使用することをお勧めしますそれは既存のデータベースなどが好きなので)サポートされています - この投稿EF - WithOptional - Left Outer Join?からわかるように、2番目にはLEFT OUTER JOINがSQLクエリに含まれています。

+0

ありがとう、偉大な答え:) – Bartosz

関連する問題