繁体   English   中英

.Net核心实体框架 - Discrimator TPH

[英].Net Core Entity Framework - Discrimator TPH

我目前正在尝试写入一个继承自抽象基类的表。 当我尝试这样做时,我得到以下错误(ContactMethod属性是鉴别器):

System.Data.SqlClient.SqlException: Invalid column name 'ContactMethod'.

EmailContactDetails.cs:

public class EmailContactDetail : ContactDetail
{
    [ApiMember(Description = "The Contact Method")]
    public override ContactMethod ContactMethod => ContactMethod.Email;

    [ApiMember(Description = "Email Address")]
    public string EmailAddress { get; set; }
}

EmailContactDetailConfiguration.cs:

public class EmailContactDetailsConfiguration : IEntityTypeConfiguration<EmailContactDetail>
{
    public void Configure(EntityTypeBuilder<EmailContactDetail> builder) => Configure(builder, "dbo");

    public void Configure(EntityTypeBuilder<EmailContactDetail> builder, string schema)
    {
        builder.Property(x => x.EmailAddress).HasColumnName("EmailAddress").HasColumnType("nvarchar(255)");
    }
}

ContactDetail.cs:

public abstract class ContactDetail
{
    [ApiMember(Description = "The Identifier")]
    public Guid Id { get; set; }

    [ApiMember(Description = "The Contact Method")]
    public virtual ContactMethod ContactMethod { get; set; }
}

ContactDetailConfiguration.cs

public class ContactDetailsConfiguration : IEntityTypeConfiguration<ContactDetail>
{
    public void Configure(EntityTypeBuilder<ContactDetail> builder) => Configure(builder, "dbo");

    public void Configure(EntityTypeBuilder<ContactDetail> builder, string schema)
    {
        builder.ToTable("ContactDetails", schema);

        // Table per hierarchy. all subclasses share the same db table for performance.
        builder.HasDiscriminator(x => x.ContactMethod)
            .HasValue<EmailContactDetail>(ContactMethod.Email);

        builder.Property(x => x.Id).HasColumnName("Id").IsRequired().HasColumnType("uniqueidentifier").ValueGeneratedOnAdd();
    }
}

我已经尝试通过将以下内容添加到ContactDetailConfiguration.cs文件来隐藏鉴别器“ContactMethod”:

builder.Ignore(x => x.ContactMethod);

一旦我这样做,我最终得到以下错误

The entity type 'EmailContactDetail' is part of a hierarchy, but does not have a discriminator property configured.

您不应该将配置为TPH鉴别器的属性隐藏在EF中,因为它对于EF Core策略的EF Core实施至关重要。

初始错误只表示您的模型和数据库不同步。 按惯例,EF Core使用string 阴影属性和名为Discriminator列。 HasDiscriminator流畅API的全部目的是允许更改鉴别器属性/列类型,以及将其映射到实体模型的现有属性。

这是哪种情况。 您已经告诉EF Core使用您现有的属性ContactMethod作为鉴别器,因此EF Core正在数据库表中查找名为ContactMethod的列。 因此,要解决此问题,只需从模型更新数据库(使用模型更改时的常规过程 - 添加新迁移,更新数据库等)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM