簡體   English   中英

EF6 CodeFirst繼承和依賴於區分值的外部關系

[英]EF6 CodeFirst inheritance and foreign relation dependent on discriminator value

當前,我正在使用代碼優先方法編寫應用程序,並且我需要創建兩個非常相似的實體,可以說代表地址,所以我已經創建了:

public abstract class BaseEntity
{
    public Guid Id { set; get; }
}

public abstract class Address : BaseEntity
{
    public string Discriminator { set; get; }

    public Guid ObjectId { set; get; }

    public Guid CountryId { set; get; }

    public virtual Country Country { set; get; }

    public string Town { set; get; }

    public string PostalCode { set; get; }

    public string Street { set; get; }

    public string BuildingNumber { get; set; }

    public string FlatNumber { get; set; }

    public AddressType AddressType { get; set; }

    public bool IsDefault { get; set; }
}

然后,我有兩個繼承自Address類的類,如下所示:

public class UserAddress : Address
{
    public virtual User User { set; get; }
}

public class ContractorAddress : Address
{
    public virtual Contractor Contractor { set; get; }
}

現在,我需要使模型構建器將抽象類中的ObjectId屬性的值映射到兩個不同的類(對於UserAddress它應指向User.Id值,而User Navigation屬性應使用此值,對於ContractorAddress它應指向Contractor.Id值和“ Contractor導航”屬性應使用此值)我想使用“每個層次結構表(TPH)”方法。

我的問題是,我應該如何在模型構建器中描述這些關系?

為您的映射添加配置類。 對於TPH使用:

class AddressConfiguration : EntityTypeConfiguration<Address>
{
    public AddressConfiguration()
    {
        Map<UserAddress>(m => m.Requires("AddressType").HasValue("user"));
        Map<ContractorAddress>(m => m.Requires("AddressType").HasValue("contractor"));
    }
}

至於關系:

class UserAddressConfiguration : EntityTypeConfiguration<UserAddress>
{
    public UserAddressConfiguration()
    {
        HasRequired(m => m.User).WithMany().HasForeignKey(m => m.ObjectId);
    }
}
class ContractorAddressConfiguration : EntityTypeConfiguration<ContractorAddress>
{
    public ContractorAddressConfiguration()
    {
        HasRequired(m => m.Contractor).WithMany().HasForeignKey(m => m.ObjectId);
    }
}

映射其他屬性應該很簡單。 最后,將您的配置添加到模型構建器中:

modelBuilder.Configurations.Add(new AddressConfiguration());
modelBuilder.Configurations.Add(new UserAddressConfiguration());
modelBuilder.Configurations.Add(new ContractorAddressConfiguration());

請注意,TPH表示您的實體已映射到一個表,因此您有一列ObjectId引用了2個不同的表。 我建議您從基類中刪除ObjectId,將UserId和ContractorId添加到子類中,並映射與它們的關系。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM