Einer von Vielen mit einer join-Tabelle und eine optionale Beziehung im Entity Framework 4.1 Fluent-API
Wieder mit einem legacy-Datenbank können nicht geändert werden und mit Entity Framework 4.1 mit der Fluent-API zum Lesen von Daten.
public class Client
{
[Key]
public int ClientID { get; set; }
public string Name { get; set ;}
public virtual ICollection<Phone> Phones { get; set; }
}
public class Phone
{
[Key]
public int PhoneID { get; set; }
public string Number { get; set; }
public virtual Client Client { get; set; }
}
public class ClientPhone
{
[Key]
[Column(Order=0)]
public int ClientID { get; set; }
[Key]
[Column(Order=1)]
public int PhoneID { get; set; }
}
Ich will, dass die Kunden zu haben, viele Handys, aber die Telefone haben sollte nur eine optionale Client.
Hinweis: die Telefone sollten nur 0/1 Client. Ich will NICHT eine viele zu viele.
Also habe ich versucht, die folgenden:
modelBuilder.Entity<Client>()
.HasMany(c => c.Phones)
.WithOptional(p => p.Client)
.Map(m =>
{
m.MapKey("ClientID");
m.ToTable("ClientPhone");
});
modelBuilder.Entity<Phone>()
.HasOptional(p => p.Client)
.WithMany(c => c.Phones)
.Map(m =>
{
m.MapKey("PhoneID");
m.ToTable("ClientPhone");
});
Habe ich versucht, ein paar von Permutationen in der Regel immer eine Fehlermeldung über "Jede Eigenschaft name in einem Typ eindeutig sein müssen."
Danke für die Hilfe.
EDIT MIT ANTWORT
Hier sind die änderungen, die ich gemacht, um die entity-Klassen. Es ist möglich, zu navigieren aus ein Client zu viele Handys und von einem Telefon zu einem Kunden, aber Sie müssen gehen Sie durch die ClientPhone join-Tabelle.
[Table("Client")]
public class Client
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ClientID { get; set; }
public string Name { get; set ;}
public virtual ICollection<Phone> Phones { get; set; } //Client has * Phones
}
[Table("Phone")]
public class Phone
{
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int PhoneID { get; set; }
public string Number { get; set; }
public virtual Client Client { get; set; } //Phone has 0|1 Client
}
[Table("ClientPhone")]
public class ClientPhone
{
//Removed the Key attribute
public int ClientID { get; set; }
[Key] //Left the Key on the 0|1 side
[ForeignKey("Phone")]
public int PhoneID { get; set; }
public virtual Client Client { get; set; } //One Client
public virtual Phone Phone { get; set; } //One Phone
}
- Wie sind deine Tabellen definiert? Welche Tabellen hast du in der Datenbank und welche Beziehungen konfiguriert sind? Wenn Datenbank enthält eine viele-zu-viele-und junction-Tabelle, die Sie nicht zuordnen kann, es als eins-zu-viele.
Du musst angemeldet sein, um einen Kommentar abzugeben.
müssen Sie nicht angeben, die Beziehung zwischen Telefon-und client zwei mal hier. Verwenden Sie einfach nur einen wie diesen.
brauchen Sie nicht zu haben, Modelle zu anzeigen Beziehung-Tabellen, wie "ClientPhone" weil EF wird sich darum kümmern .Wenn Sie eine legacy-Datenbank können Sie Ihre Zuordnungen wie in meiner Antwort. Und wie @Mrnka Ladislav sagte, für viele rel.ationship in der Datenbank-Ebene, die Sie nicht wollen, um eine getrennte Tabelle für die Beziehung. Für, die ,
das wird genug sein, mit EF. Sie erstellen zwei Tabellen, mit clientId Spalte in Telefon - Tabelle, die Beziehung zu halten.
Das problem ist, Sie haben getrennte Tabelle für die Beziehung in Ihren legacy-Datenbank.Ich denke, dass legacy-Datenbank definiert ist, für die viele-zu-viele-Beziehung.Zweimal überlegen, Ihre domain-Logik wieder.
Wenn Sie möchten, um eins-zu-viele-Beziehung, was ich denke ist, definieren Sie in der domain-Ebene viele-zu-viele-Beziehung (Telefon, haben viele Kunden und AUFTRAGGEBER haben viele Handys in den Modell-Klassen) und Sie in der business-Schicht hinzufügen von Validierungen zu halten, nur eine client für eine Telefon.
Eins zu viele relation nicht beitreten (Kreuzung) auf die Tabelle. Wenn Ihre Datenbank verwendet Zuordnungstabelle zu verbinden-Client-zu-Telefon, das Sie verwenden müssen, viele-zu-viele-Beziehung (Telefon kann viele Kunden) @Jayantha beschrieben.