我正在使用 EF6,首先从 edmx 迁移到 Code。我从现有数据库进行了逆向工程,我试图重现我之前的模型,其中嵌套 TPH 在名为“Contacts”的表上完成,该表分别具有 2 个不同的字段“Type”和“SubType”作为第一个和二级鉴别器。
我想要这样的东西:
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 作为具体类,但不包括“类型”和“子类型”字段,因为它们是鉴别器。
这是映射代码:
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 没有默认值且不可为空。存储实体数据需要列值。
数据库中的“类型”和“子类型”字段是 Tinyint 可以为空的,没有默认值。我也尝试将它们更改为可为空或提供默认值,但它不会更改产生的错误。
我在设置映射时做错了什么,还是我选择了错误的方式来面对这种情况?