2011-11-15 4 views
19

私はEFの初心者で、コードの最初のアプローチと多対多の一方向関係を取得しようとしています。例えば、2つのクラス(私の実際のモデルではない)を、それらの間のN * N関係にするが、 "顧客"側からのナビゲーションプロパティはない。コードファーストエンティティフレームワークの単方向多対多実体化

public class User { 
    public int UserId { get; set; } 
    public string Email { get; set; } 
    public ICollection TaggedCustomers { get; set; } 
} 
public class Customer { 
    public int CustomerId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
}

マッピングコードが

modelBuilder.Entity() 
     .HasMany(r => r.TaggedCustomers) 
     .WithMany(c => c.ANavgiationPropertyWhichIDontWant) 
     .Map(m => 
     { 
      m.MapLeftKey("UserId"); 
       m.MapRightKey("CustomerId"); 
       m.ToTable("BridgeTableForCustomerAndUser"); 
     });

...のように見えるこの構文では、 "顧客" エンティティの "WithMany" を持つために私を強制します。 次のurlは、「規約上、コードファーストは常に一方向の関係を一対多として解釈します」と述べています。

これを無効にすることはできますか、他の方法を使用する必要がありますか?

答えて

35

使用この:

public class User { 
    public int UserId { get; set; } 
    public string Email { get; set; } 
    // You must use generic collection 
    public virtual ICollection<Customer> TaggedCustomers { get; set; } 
} 

public class Customer { 
    public int CustomerId { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

し、それをマップ:

modelBuilder.Entity<User>() 
    .HasMany(r => r.TaggedCustomers) 
    .WithMany() // No navigation property here 
    .Map(m => 
     { 
      m.MapLeftKey("UserId"); 
      m.MapRightKey("CustomerId"); 
      m.ToTable("BridgeTableForCustomerAndUser"); 
     }); 
+1

どうもありがとう、どのようなシンプルなソリューション。私の顔を救うために、私はそれを私の無知ではなくドキュメンテーションの欠如に責めます。 –

+0

属性でこれを行うことは可能ですか? – TDaver

+0

@TDaver:いいえ。属性は、両端にナビゲーション・プロパティーがあり、ジャンクション表の名前と列を制御することを期待していない場合にのみ機能します。 –

関連する問題