私のモデルを要約するには:
- ライセンスと証明書は資格の子です
- Qualification には 1 つだけの専門職があります
- 職業は、認可された種類 (タイプ 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 は次のとおりです。
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がFK プロパティを TPH 識別子として兼用することを許可していないためです。これは、Type を識別子と外部キー フィールドの両方にすることはできないことを意味します。各エンティティの HasConstraint メソッドで職業タイプをハードコーディングしようとしても機能しません。これにより、例外が生成されます。
可能な解決策は、Profession に代理キーを追加し、Qualification の Type プロパティを取り除き、ProfessionId FK に置き換えることです。これにより、冗長性の懸念が取り除かれますが、TPH も破壊されます。実際には、弁別子は資格から専門職に移動します。ここでの問題は、License オブジェクトと Certificate オブジェクトをマップする方法がわからなかったことです。代わりにビューにマップできますか?しかし、Code First でそれを行うにはどうすればよいでしょうか。
ですから、今、私は多くの好ましくない選択に直面しています。助言がありますか?