2016-04-13 2 views
1

J'ai une classe de contactEntity Framework - Modélisation des rôles multiples pour une même entité

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

J'ai deux classes héritant de Contact:

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

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

J'utilise Entity Framework 6.3 comme mon 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; 

Quand je fais:

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

De toute évidence, il ne me permet pas d'ajouter le dossier. je reçois une erreur:...

« Violation de contrainte PRIMARY KEY 'PK_dbo.Contacts' Impossible d'insérer clé en double dans l'objet 'dbo.Contacts' La valeur clé en double est (C1) \ r déclaration \ nLe a été résilié. "

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

Merci

Répondre

1

Je suppose que vous ne faites pas tout mappage d'héritage spécifique qui, par défaut tracera ce que le tableau par héritage Hiérarchie (TPH). Avec ce mappage, vous obtenez une seule table Db qui contient l'agrégat de tous les champs du type de base et les types dépendants avec un champ discriminant pour savoir de quel type la ligne doit être matérialisée. Cela permet de faire une requête où vous demandez un type. Avec TPH, chaque ligne ne peut être qu'un seul type. Vous ne pouvez donc pas avoir la même ligne à la fois comme employé et comme fournisseur. Il existe un autre type de mappage appelé Tableau par type (TPT) qui créera une table pour chaque type, donc dans votre cas 3, un pour les champs partagés et un pour chaque type dépendant. Cela devrait permettre ce que vous demandez. (YMMV)

Toutefois, il semble que l'employé et le fournisseur seraient utilisés dans des domaines très différents. Je vous suggère donc de créer votre tableau de contacts et de le mettre en relation avec votre employé et votre fournisseur.

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

Maintenant, vous pouvez demander à un employé:

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

Ou pour un fournisseur:

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

Ce qui pourrait être plus propre que la requête inheritence vous devez:

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

Dans les deux Has A modélisation I montrent ab ove et le A Is Modeling avec TPT vous obtenez trois tables. Vous avez juste le FK dans ce que je montre plutôt que le même ID dans 3 tables avec TPT. Il y a aussi Table par classe que vous pouvez regarder, ce qui est similaire à TPT mais vous n'obtenez pas de table pour la classe abstract/parent, mais vous obtenez une table pour chaque type dépendant avec tous les champs dedans. Je ne pense pas que ce soit ce que vous voulez, car il aurait des données en double, mais cela signifie moins de jointures.

+0

Merci. Cela a l'air très bien. Mais est-il possible d'implémenter ceci avec une relation IsA. – Satyajit

+0

Comme je l'ai dit, utilisez un mappage TPT ou TPC et vous devriez être capable d'avoir le même ID que les deux types. Cependant, je pense que vous vous battez vraiment le cadre en faisant cela. – PilotBob

+0

Merci. J'ai essayé ceci avec la cartographie TPT. J'ai l'erreur mentionnée dans le message ci-dessus. – Satyajit