2013-06-06 7 views
11

Czy jest możliwe utworzenie jednokierunkowego wiele-do-wielu powiązań w strukturze encji 6 z kodem jako pierwszym i adnotacjami? Przykład:Podmiot Framework 6 code first - jeden sposób wiele do wielu za pomocą adnotacji

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

na Java + WZP adnotacje mogę wdrażają co muszę w ten sposób:

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

tak, czy EF mają równe możliwości?

Odpowiedz

0

Myślę, że chcesz nauczyć się oddzielać relacje od pierwszych encji kodu EF. Rozpocząłem temat w tym numerze na temat here. Chcę oddzielić obiekty relacji od encji i użyłem klas częściowych. W moim pytaniu chcę nauczyć się oddzielać klasy cząstkowe według klasy bilrary. Ale nie mógł.

Podczas korzystania z NHibernate używałem mapowania XML i tworzenia relacji tutaj, w platformie java jest to samo. Ale myślę, że Entity Framework nie jest jeszcze gotowy.

30

Można to zrobić, określając relację jawnie za pomocą Fluent API. Przesłonić metodę klasy DbContextOnModelCreating(), aw swoim ręcznym określić szczegóły tabeli mapowania jak poniżej:

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

Należy zauważyć, że - moim szybkiego testu w każdym razie - trzeba będzie Include() właściwość Waluty podczas ładowania obiekt EF się lista zaludnione:

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

EDIT

Jeśli naprawdę chcesz robić wszystko z danymi adnotacji, a nie korzystać z Fluent w ogóle, to można modelować j oin tabela wyraźnie, jak wskazano elsewhere. Istnieją jednak różne wady tego podejścia, dlatego wydaje się, że najlepszym podejściem jest metoda 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

Dziękuję ... Czy ta konfiguracja jest możliwa tylko z adnotacjami? – Anton

+0

Myślę, że najlepsze, co można zrobić, to jawnie modelować tabelę dołączeń. Utwórz więc klasę CountryCurrency obok innych obiektów EF i zastąp właściwość 'currency' w obiekcie Country wartością' ICollection . Ma to jednak wady związane z użytecznością, ponieważ EF nie wykona automatycznie dla ciebie POŁĄCZEŃ. –

+0

Dziwne, że nie można tego zrobić za pomocą atrybutów. EF to bałagan. – yonexbat

0

Można to zrobić w kodzie najpierw dość łatwo w 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 - 

} 

skompilować, uruchomić go i hey presto - magia dołączyć tabelę w tle. Zależy, czy przeszkadzają Ci konwencje nazewnictwa. Osobiście uważam, że jeśli robisz kod pierwszy, powinieneś zrobić to wszystko w kodzie. Niektórzy wolą adnotację, niektórzy wolą płynny interfejs API - użyj tego, co lubisz.

+0

Pytanie dotyczyło nawigacji w jedną stronę. Dodanie krajów do waluty usuwa to ograniczenie. – KyorCode

+0

Słyszę, co mówisz, ale z tego, co mogę powiedzieć, że 1 sposób nawigacji właściwościami rodzajami są sprzeczne z pierwszymi zasadami kodu. Jaka jest wada umieszczania obu kolekcji? Czy staje się mniej wydajne? – Will