Pour résumer mon modèle:clé étrangère comme discriminateur TPH à EF4 en utilisant le code CTP4 Première
- Licence et certificat sont des enfants de qualification
- Une qualification a une et une seule profession
- Une profession est soit une sorte sous licence (type 1) ou d'un type certifié (type 2)
Exigence: Représentent les relations entre entiti d'affaires sans introduire de redondance dans le schéma de base de données. Le type de qualification (licence/certificat) doit correspondre au type de profession.
Voici mon modèle simplifié tel qu'il est actuellement - je vous expliquer pourquoi cela ne fonctionne pas au-dessous:
Public Class Profession
<Key()>
<DataMember(Order:=0)>
Public Property Type As Integer
<Key()>
<DataMember(Order:=1)>
Public Property Code As String
Public Property Title As String
End Class
Public Class Qualification
Public Property Id As Integer
Public Property PersonId As Integer
Public Property Type As Integer
Public Property ProfessionCode As String
Public Overridable Property Person As Person
Public Overridable Property Profession As Profession
End Class
Public Class License
Inherits Qualification
Public Property Number As String
End Class
Public Class Certificate
Inherits Qualification
Public Property IssuerName As String
End Class
Voici le ModelBuilder simplifié:
modelBuilder.Entity(Of Qualification) _
.Property(Function(q) q.ProfessionCode).IsRequired()
modelBuilder.Entity(Of Qualification) _
.HasRequired(Of Profession)(Function(q) q.Profession) _
.HasConstraint(Function(q, p) p.Type = q.Type AndAlso p.Code = q.ProfessionCode)
modelBuilder.Entity(Of Qualification) _
.MapHierarchy() _
.Case(Of Qualification)(Function(q) New With {
q.Id,
q.PersonId,
q.ProfessionCode,
.Type = 0) _
.Case(Of License)(Function(q) New With {
q.Number,
.Type = 1}) _
.Case(Of Certificate)(Function(q) New With {
q.IssuerName,
.Type = 2}) _
.ToTable("dbo.Qualifications")
La raison pour laquelle cela ne travail est que EF4 does not allow propriétés FK à doubler en tant que discriminateur TPH. Cela signifie que le type ne peut pas être à la fois un discriminateur et un champ de clé étrangère. Essayer de coder en dur Profession La saisie de la méthode HasConstraint pour chaque entité ne fonctionne pas non plus - cela génère une exception.
Une solution possible serait d'ajouter une clé de substitution à Profession, de se débarrasser de la propriété Type dans Qualification et de la remplacer par ProfessionId FK. Cela supprimerait la préoccupation de redondance, mais détruirait aussi TPH. En effet, le discriminateur passe de Qualification à Profession. Le problème ici est que je n'ai pas trouvé un moyen de cartographier les objets Licence et Certificat. Peut-être que je peux mapper à des vues à la place? Mais comment puis-je faire ça dans Code First? Donc, maintenant, je suis confronté à un certain nombre de choix peu recommandables. Aucune suggestion?
@Morteza, Merci pour votre contribution. J'espérais qu'il pourrait y avoir une meilleure façon de ne pas violer DRY. Comme vous le savez, Type est redondant dans cette solution. Souhaitez-vous simplement essayer de contrôler cela par le biais de règles métier? – Antony
En * contrôlant cela par le biais des règles métier *, vous voulez dire ne pas avoir de colonne de discriminateur et regarder seulement dans ProfessionType dans le tableau Qualification et déterminer quel type d'objet vous avez affaire, correct? –
J'ai ajouté une autre façon d'éviter DRY à ma réponse: TPT au lieu de TPH. –