私は EF6 を使用しており、最初に edmx からコードに移行しています。私は既存のDBからリバースエンジニアリングを行い、「Contacts」と呼ばれるテーブルでネストされたTPHを使用して、以前のモデルを再現しようとしています。第 2 レベルの識別器。
私はこのようなものが欲しいです:
Contact
Model (Type = 1)
BookingModel (SubType = 1)
ScoutingModel (Subtype = 2)
Customer (Type = 2)
Agency (SubType = 3)
Client (Subtype = 4)
Service (Subtype = 5)
Contact、Model、および Customer クラスを Abstract としてコーディングし、BookingModel、ScoutingModel、Agency、Client、Service を Concrete としてコーディングしましたが、"Type" フィールドと "Subtype" フィールドは識別子であるため、それらを含めません。
マッピングコードは次のとおりです。
public virtual DbSet<Contact> Contacts { get; set; }
modelBuilder.Entity<Contact>()
.Map<Model>(e => e.Requires("Type").HasValue((byte)ContactTypeEnum.Model))
.Map<Customer>(e => e.Requires("Type").HasValue((byte)ContactTypeEnum.Customer));
modelBuilder.Entity<Customer>()
.Map<Agency>(e => {
e.Requires("Type").HasValue((byte)ContactTypeEnum.Customer);
e.Requires("SubType").HasValue((byte)CustomerTypeEnum.Agency);
})
.Map<Client>(e => {
e.Requires("Type").HasValue((byte)ContactTypeEnum.Customer);
e.Requires("SubType").HasValue((byte)CustomerTypeEnum.Client);
})
.Map<Service>(e => {
e.Requires("Type").HasValue((byte)ContactTypeEnum.Customer);
e.Requires("SubType").HasValue((byte)CustomerTypeEnum.Service);
});
modelBuilder.Entity<Model>()
.Map<BookingModel>(e => {
e.Requires("Type").HasValue((byte)ContactTypeEnum.Model);
e.Requires("SubType").HasValue((byte)ModelTypeEnum.Booking);
})
.Map<ScoutingModel>(e => {
e.Requires("Type").HasValue((byte)ContactTypeEnum.Model);
e.Requires("SubType").HasValue((byte)ModelTypeEnum.Scouting);
});
しかし、これは機能していません。次のようなエラーが発生します
(52,10) : エラー 3023: 52、68、75、82、89、98、106、729、747 行目から始まるフラグメントのマッピングに問題があります: 列 Contact.Type には既定値がなく、null 可能ではありません。エンティティ データを格納するには、列の値が必要です。
DB の「Type」および「SubType」フィールドは、デフォルト値のない Tinyint nullable です。nullable として変更するか、デフォルト値を指定することも試みましたが、結果のエラーは変更されません。
マッピングの設定に何か間違ったことをしていますか、それともこのシナリオに直面するために間違った方法を選択していますか?