2016-04-13 5 views
1

Ich habe eine KontaktklasseEntity Framework - Modellierung mehrere Rollen für gleiche Einheit

[Table("Contacts")] 
public class Contact 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

Ich habe zwei von Kontakt Vererbungsklassen:

[Table("Employees")] 
public class Employee : Contact 
{ 
    public decimal Salary { get; set; } 
} 

[Table("Suppliers")] 
public class Supplier : Contact 
{ 
    public string TIN { get; set; } 
} 

Ich bin mit Entity Framework-6.3 als meine ORM.

Can I model something where the same contact can be both Employee and Supplier with the same unique Id.

Employee emp = new Employee(); 
emp.Id = "C1"; 
emp.Name = "Employees"; 
emp.Salary = 10000; 
emp.TrackingState = TrackingState.Added; 

Supplier sup = new Supplier(); 
sup.Id = "C1"; 
sup.Name = "Employees"; 
sup.TIN = "ABC"; 
sup.TrackingState = TrackingState.Added; 

Wenn ich tun:

context.Employee.Add(emp); 
context.Supplier.Add(sup); 
context.Save(); 

Offensichtlich wird es mir nicht erlauben, den Datensatz hinzuzufügen. Ich erhalte eine Fehlermeldung:...

„Verletzung von PRIMARY KEY-Einschränkung 'PK_dbo.Contacts' Doppelt Schlüssel kann nicht in Objekt 'dbo.Contacts' einfügen Der doppelte Schlüsselwert (C1) \ r \ nDie Anweisung hat wurde beendet. "

Can I make the Supplier also share the same Id as that of employee and enable insert/update of employee and supplier?

Dank

Antwort

1

Ich nehme an, Sie kein spezifisches Erbe Mapping tun, das standardmäßig wird dies pro Hierarchie (TPH) Vererbung als Tabelle zuordnen. Mit dieser Zuordnung erhalten Sie eine einzelne Db-Tabelle, die das Aggregat aller Felder im Basistyp und der abhängigen Typen mit einem Diskriminatorfeld enthält, um zu wissen, welchen Typ die Zeile materialisieren soll. Dies ermöglicht eine Abfrage, wo Sie nach einem Typ fragen.

Mit TPH kann jede Zeile nur ein einziger Typ sein, so dass Sie nicht dieselbe Zeile als Mitarbeiter und Lieferant haben können.

Es gibt eine andere Art von Mapping namens TableType (TPT), die eine Tabelle für jeden Typ erstellt, also in Ihrem Fall 3, einen für die gemeinsamen Felder und einen für jeden abhängigen Typ. Dies sollte ermöglichen, wonach Sie fragen. (YMMV)

Es scheint jedoch, dass Mitarbeiter und Lieferant in vielen verschiedenen Domänen verwendet werden würde, so würde ich vorschlagen, dass Sie Ihre Kontakttabelle erstellen und beziehen Sie es sowohl an Ihren Mitarbeiter und Lieferanten.

[Table("Contacts")] 
public class Contact 
{ 
    public string Id { get; set; } 
    public string Name { get; set; } 
} 

[Table("Employees")] 
public class Employee 
{ 
    public string Id { get; set; } 
    public string ContactId { get; set; } 
    public decimal Salary { get; set; } 

    public Contact Contact { get; set; } 
} 

[Table("Suppliers")] 
public class Supplier 
{ 
    public string Id { get; set; } 
    public string ContactId { get; set; } 
    public string TIN { get; set; } 

    public Contact Contact { get; set; } 
} 

Jetzt können Sie für einen Mitarbeiter abfragen:

db.Employees.Include(e => e.Contact).First(); 

Oder für einen Anbieter:

db.Employees.Include(e => e.Contact).First(); 

Welche sauberer als die inheritence Abfrage könnte man braucht:

db.Contacts.OfType<Employee>().First(); 

In beiden Has A Modellierung zeige ich ab Ove und das ist eine Modellierung mit TPT Sie erhalten drei Tabellen. Sie haben nur die FK in dem, was ich zeige, anstatt die gleiche ID in 3 Tabellen mit TPT.

Es gibt auch Tabelle pro Klasse, die Sie betrachten können, die TPT ähnelt, aber Sie erhalten keine Tabelle für die abstrakte/übergeordnete Klasse, stattdessen erhalten Sie Tabelle für jeden abhängigen Typ mit allen Feldern darin. Ich glaube nicht, dass dies das ist, was Sie wollen, weil es doppelte Daten haben würde, aber es bedeutet weniger Joins.

+0

Danke. Das sieht sehr gut aus. Aber gibt es eine Möglichkeit, dies mit einer IsA-Beziehung umzusetzen? – Satyajit

+0

Wie bereits erwähnt, verwenden Sie eine TPT- oder TPC-Zuordnung und Sie sollten die gleiche ID als beide Typen haben. Ich denke jedoch, dass Sie den Rahmen dafür wirklich kämpfen. – PilotBob

+0

Danke. Ich habe das mit TPT-Mapping probiert. Ich erhalte den Fehler, der oben im Beitrag erwähnt wurde. – Satyajit

Verwandte Themen