4

我正在使用 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 可以为空的,没有默认值。我也尝试将它们更改为可为空或提供默认值,但它不会更改产生的错误。

我在设置映射时做错了什么,还是我选择了错误的方式来面对这种情况?

4

0 回答 0