[英]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.