是否可以在实体框架中向派生类型添加备用密钥?

时间:2018-03-01 16:46:36

标签: c# entity-framework asp.net-core

在我正在进行的项目中,我们从我们内部制作的库中提取了一些基础模型。我们将它用于多个项目,到目前为止一直非常有用。我遇到的问题是我们有一个特殊的场景,我们需要在派生模型上使用一个额外的属性作为备用键,但EntityFramework抱怨在某个派生类型上无法创建AK。这是我尝试完成的一个基本例子(有很多脂肪修剪):

导入的库

LoginFormPostbackData

当前项目

LoginFormPostbackData

1 个答案:

答案 0 :(得分:0)

嗯,首先,您的CustomerMap类应该继承BaseCustomerMap类。

public class CustomerMap : BaseCustomerMap
{
    public CustomerMap(EntityTypeBuilder<Customer> entityBuilder)
        : base(entityBuilder)
    {
        entityBuilder
            .HasAlternateKey(t => t.AdditionalIntField );
    }
}

<强>更新

呀。我回答得太快,并没有真正关注。您应该使BaseCustomerMap类通用:

public class BaseCustomerMap<TEntity>
    where TEntity : BaseCustomer
{
    public BaseCustomerMap(EntityTypeBuilder<TEntity> entityBuilder)
    {
        entityBuilder
            .HasKey(t => t.Id );

        entityBuilder.Property(t => t.Id)
            .ValueGeneratedOnAdd();
    }
}

然后,你可以这样做:

public class CustomerMap : BaseCustomerMap<Customer>

实际上,不管怎样,你都不想配置基类,因为这可能不应该成为你的上下文的一部分。您正在寻找的是能够为BaseCustomer派生的所有实体共享配置,这些实体会向您发送。