2013-06-06 7 views
11

エンティティフレームワーク6で、コードと注釈を使用して一方向の多対多の関連付けを作成できますか?例:私はこのように必要なものを実装することができますJavaの+ JPAのアノテーションでエンティティフレームワーク6のコード - アノテーションを使用して多方向から多方向

class Currency 
{ 
    public int id { get; set; } 
} 

class Country 
{ 
    public int id { get; set; } 

    // How i can annotate this property to say EF that it is many-to-many 
    // and it should create mapping table? 
    // I don't need navigation property to Country in Currency class! 
    public virtual IList<Currency> currencies { get; set; } 
} 

:そう

@OneToMany 
@JoinTable(name = "MAPPING_TABLE", joinColumns = { 
    @JoinColumn(name = "THIS_ID", referencedColumnName = "ID") 
}, inverseJoinColumns = { 
    @JoinColumn(name = "OTHER_ID", referencedColumnName = "ID") 
}) 

は、EFは同じ機能を持っていますか?

答えて

0

私はEFコードの最初のエンティティからリレーションを分離する方法を学びたいと思います。私はこの質問についてhereで話題を始めました。関係オブジェクトをエンティティから分離する必要があり、部分クラスを使用しました。私の質問では、部分クラスをバイラリクラスで分ける方法を学びたい。しかし、できませんでした。

私はNHibernateを使用していましたが、XMLマッピングを使用してここで関係を作成していましたが、Javaプラットフォームでも同じことです。しかし、Entity Frameworkはまだ準備が整っていないと思います。

30

これは、Fluent APIを使用して明示的にリレーションシップを指定することで実行できます。あなたのDbContextクラスのOnModelCreating()メソッドをオーバーライドし、オーバーライドして、このようなマッピングテーブルの詳細を指定:

class MyContext : DbContext 
{ 
    public DbSet<Currency> Currencies { get; set; } 
    public DbSet<Country> Countries { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Country>() 
      .HasMany(c => c.Currencies) 
      .WithMany()     // Note the empty WithMany() 
      .Map(x => 
      { 
       x.MapLeftKey("CountryId"); 
       x.MapRightKey("CurrencyId"); 
       x.ToTable("CountryCurrencyMapping"); 
      }); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

なお、 - とにかく私の簡単なテストでは - ロードするときにInclude()に通貨のプロパティを持っていますあなたが本当にデータ注釈ですべてをやってみたい、と全く流暢使用しない場合は、あなたがJをモデル化することができ

  var us = db.Countries 
         .Where(x => x.Name == "United States") 
         .Include(x=>x.Currencies) 
         .First(); 

EDIT

:リスト人口を持つEFオブジェクト明示的に指摘されているように、テーブルelsewhere。しかし、このアプローチのさまざまなユーザビリティの欠点があります。そのため、Fluentメソッドが最良のアプローチだと思われます。魔法がバックグラウンドでテーブルを結合する -

class Country 
{ 
    public int Id { get; set; } 
    public virtual ICollection<CountryCurrency> CountryCurrencies { get; set; } 
} 

class Currency 
{ 
    public int Id { get; set; } 
} 

class CountryCurrency 
{ 
    [Key, Column(Order=0)] 
    public virtual int CountryId { get; set; } 
    [Key, Column(Order=1)] 
    public virtual int CurrencyId { get; set; } 

    public virtual Country Country { get; set; } 
    public virtual Currency Currency { get; set; } 
} 
+0

ありがとうございます...この設定はアノテーションでのみ可能ですか? – Anton

+0

私はあなたができる最良の方法は、明示的に結合テーブルをモデル化することだと思います。したがって、他のEFオブジェクトと一緒にCountryCurrencyクラスを作成し、Countryオブジェクトの 'currencies'プロパティを' ICollection 'に置き換えてください。しかし、EFはあなたのために自動的にJOINSを行うわけではないので、使い勝手の面で不利な点があります。 –

+0

属性でこれを行う方法がないことは不思議です。 EFは混乱です。 – yonexbat

0

あなたがEF 6

public class Country 
{ 
    public int ID {get;set;} 

    public virtual ICollection<Currency> Currencys {get;set;}//don't worry about the name,  pluralisation etc 


} 

public class Currency 
{ 

    public int ID {get;set;} 

    public virtual ICollection<Country> Countrys {get;set;}//same as above - 

} 

は、それをコンパイルし、それを実行して、ちょっとプレストに最初の非常に簡単にコードでこれを行うことができます。命名規則があなたを気にするかどうかによって異なります。私は個人的には、コードを最初にやっているならば、コード内でそれをすべて行うべきだと思います。注釈を好む人もいれば、流暢なAPIを好む人もいます。

+0

質問は片道ナビゲーションについて明白でした。国を通貨に追加すると、その制限が解除されます。 – KyorCode

+0

私はあなたが言っていることを聞いていますが、私は片方向のナビゲーションプロパティにはコードの第一原則に反するものを伝えることができます。両方のコレクションを入れることの不利な点は何ですか?それはパフォーマンスが低下しますか? – Will

関連する問題