要總結一下我的模型EF4 TPH鑑別:外鍵的使用CTP4代碼優先
- 許可和證書資格的兒童
- 資質有且只有一個職業
- 一個行業或者是有執照的種類(1型)或認證的種類(類型2)
要求:代表業務entiti之間的關係而不會在數據庫模式中引入冗餘。資格類型(許可證/證書)必須與專業類型相匹配。
這裏是我的簡化模型,因爲它目前爲 - 我解釋爲什麼不工作如下:
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
這裏的簡化模型構建器:
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")
的原因,這不工作是EF4 does not allow FK屬性作爲TPH鑑別器加倍。這意味着Type不能既是鑑別器又是外鍵字段。嘗試在每個實體的HasConstraint方法中硬編碼Profession類型也不起作用 - 這會生成一個異常。
一個可能的解決方案是將代理鍵添加到職業,擺脫資格中的類型屬性,並用ProfessionId FK替換它。這會消除冗餘問題,但也會破壞TPH。實際上,鑑別者從資格轉移到職業。這裏的問題是,我還沒有想出映射許可證和證書對象的方法。也許我可以映射到視圖呢?但我如何在Code First中做到這一點?
所以,現在我面臨着一些不愉快的選擇。有什麼建議麼?
@Morteza,感謝您的貢獻。我希望可能有更好的方式,沒有違反DRY。正如你所認識到的,Type在這個解決方案中是多餘的你會試圖通過業務規則來控制這個嗎? – Antony 2010-11-21 04:32:44
By *通過業務規則來控制*您的意思是根本沒有鑑別器列,只需查看Qualification表中的ProfessionType並找出正在處理的對象類型,對不對? – 2010-11-21 04:46:22
我已經添加了另一種方法來避免DRY到我的答案:TPT而不是TPH。 – 2010-11-21 19:52:27