EF Core“实体类型未配置鉴别器属性”

4
我有一个如下所示的模型结构:
public abstract class BaseEntity
{
    [Key]
    public int Id { get; set; }
}
public abstract class AbstractRegistration : BaseEntity
{
    public int UserId { get; set; }
}
public class Registration1 : AbstractRegistration
{
    public string ReferenceNumber { get; set; }
}
public class Registration2 : AbstractRegistration
{
}

配置部分是:

public class AbstractRegistrationConfig : IEntityTypeConfiguration<AbstractRegistration>
{
    public void Configure(EntityTypeBuilder<AbstractRegistration> builder)
    {
        // map table and schema
        builder.ToTable("tbl_reg");

        // map properties with actual columns
        builder.Property(t => t.Id).HasColumnName("id");
        builder.Property(t => t.UserId).HasColumnName("userId");

        builder.HasDiscriminator<int>("Id")
                .HasValue<AbstractRegistration>(0)
                .HasValue<Registration1>(1)
                .HasValue<Registration2>(2);
        builder.HasDiscriminator<string>("RegNumber")
                .HasValue<Registration1>("1");
    }
}

public class Registration1Config : IEntityTypeConfiguration<Registration1>
{
    public void Configure(EntityTypeBuilder<Registration1> builder)
    {
        // map table and schema
        builder.ToTable("tbl_reg1");

        // map properties with actual columns
        builder.Property(t => t.Id).HasColumnName("id");
        builder.Property(t => t.RegNumber).HasColumnName("reg_num");
    }
}

出现的错误是:“实体类型'Registration1'是层次结构的一部分,但未配置鉴别器属性。”

请建议。

EntityFrameworkCore版本=2.0.1.0


请点击Table Per Hierarchy Inheritance并查看是否有帮助。 - undefined
@MarkG,你提到的方法不同,我的基类与一个表相关,而派生类与另一个表相关,所以我需要同时包含两者的配置。 - undefined
看起来你正在为同一个实体配置多个判别器,而且你还没有完成。 - undefined
1个回答

0
首先,存在一个设计问题。你在“Id”属性上定义了鉴别器,而这也是你的基本实体的键。考虑使用一个不同的属性作为鉴别器,比如“RegistrationType”。
其次,直接使用现有的列作为鉴别器是不可取的。在Entity Framework Core中,删除现有的列并重新创建它作为鉴别器,就像你在代码中尝试的那样。但是,请确保鉴别器属性不是键列。
第三,如果你在.NET Entity中使用这个属性,请将其标记为[NotMapped],以防止它被持久化到数据库中。
以下是你代码的更新版本:
public abstract class BaseEntity
{
    [Key]
    public int Id { get; set; }
}

public abstract class AbstractRegistration : BaseEntity
{
    public int UserId { get; set; }
    [NotMapped]
    public string RegistrationType { get; set; } // Use this as discriminator
}

public class Registration1 : AbstractRegistration
{
    public string ReferenceNumber { get; set; }
}

public class Registration2 : AbstractRegistration
{
}

public class AbstractRegistrationConfig : IEntityTypeConfiguration<AbstractRegistration>
{
    public void Configure(EntityTypeBuilder<AbstractRegistration> builder)
    {
        // map table and schema
        builder.ToTable("tbl_reg");

        // map properties with actual columns
        builder.Property(t => t.Id).HasColumnName("id");
        builder.Property(t => t.UserId).HasColumnName("userId");

        builder.HasDiscriminator<string>("RegistrationType")
                .HasValue<AbstractRegistration>("0")
                .HasValue<Registration1>("1")
                .HasValue<Registration2>("2");
    }
}

public class Registration1Config : IEntityTypeConfiguration<Registration1>
{
    public void Configure(EntityTypeBuilder<Registration1> builder)
    {
        // map table and schema
        builder.ToTable("tbl_reg1");

        // map properties with actual columns
        builder.Property(t => t.Id).HasColumnName("id");
        builder.Property(t => t.ReferenceNumber).HasColumnName("reg_num");
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接