【发布时间】:2010-11-19 22:38:28
【问题描述】:
总结一下我的模型:
- License 和 Certificate 是 Qualification 的子代
- 一个资格只有一个职业
- 职业是许可类型(类型 1)或认证类型(类型 2)
要求:表示业务实体之间的关系,而不在数据库架构中引入冗余。资格类型(执照/证书)必须与专业类型相匹配。
这是我目前的简化模型 - 我在下面解释了为什么这不起作用:
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 添加代理键,去掉 Qualification 中的 Type 属性并将其替换为 ProfessionId FK。这将消除冗余问题,但也会破坏 TPH。实际上,鉴别器从资格转移到职业。这里的问题是我还没有找到映射许可证和证书对象的方法。也许我可以映射到视图?但是如何在 Code First 中做到这一点?
所以,现在我面临着许多令人讨厌的选择。有什么建议吗?
【问题讨论】:
标签: database-design inheritance entity-framework-4 code-first ctp4