我有一个像这样的模型结构
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
首先,存在设计问题。您已经在“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");
}
}