[英]EF6 - TPH foreign key mapping in derived classes using base class property
[英]EF6 TPH mapping of derived property to specific table specific column
将具有客户实体的旧版DB分成3个具有共享密钥的表(1-1)。 想要使用Code First TPH并将其映射到拆分表。 这是简化的类层次结构(省略了许多基本属性及其映射):
public abstract partial class Customer
{
public int Id { get; set; }
public bool Leasing { get; set; }
public string Address { get; set; }
public string Name { get; set; }
}
class PrivateCustomer : Customer
{
public string PrivateName { get; set; }
}
class CorporateCustomer : Customer
{
public string CompanyName { get; set; }
}
这是我尝试在3个表之间进行映射的方法:
public class CustomerMap : EntityTypeConfiguration<Customer>
{
public CustomerMap()
{
Map<CorporateCustomer>(m => m.Requires("ClientType").HasValue(2))
.Map<PrivateCustomer>(m => m.Requires("ClientType").HasValue(1));
// Primary Key
HasKey(t => t.Id);
// Table & Column Mappings
Map(m =>
{
m.ToTable("CustomerSet");
m.Properties(p => new
{
p.Id,
p.Leasing,
//p.PrivateName
});
});
Map(m =>
{
m.ToTable("SiriusCustomer");
m.Properties(p => new
{
p.Id,
p.Address
});
m.Property(p => p.Id).HasColumnName("AccessUserId");
m.Property(p => p.Address).HasColumnName("SiriusAddres");
});
Map(m =>
{
m.ToTable("AccessUser");
m.Properties(p => new
{
p.Id,
p.Name,
//p.CompanyName
});
m.Property(p => p.Id).HasColumnName("AccessUserId");
m.Property(p => p.Name).HasColumnName("AccessUserName");
//m.Property(p => p.CompanyName).HasColumnName("AccessUserCompany");
});
}
}
但是我不知道如何手动将PrivateName和CompanyName映射到所需表中的所需列。 那可能吗? 谢谢。
好吧,这是我设法联系到的最近的一家。 但是有一个限制,即派生的属性应映射到同一张表。 否则,将在每个表中创建确定列,这将是无用的。
public class CustomerMap : EntityTypeConfiguration<Customer>
{
public CustomerMap()
{
// Primary Key
HasKey(t => t.Id);
// Table & Column Mappings
Map<PrivateCustomer>(m =>
{
m.ToTable("AccessUser");
m.Properties(p => p.PrivateName);
m.Requires("ClientType").HasValue(1);
});
Map<CorporateCustomer>(m =>
{
m.ToTable("AccessUser");
m.Properties(p => p.CompanyName);
m.Requires("ClientType").HasValue(2);
m.Property(p=>p.CompanyName).HasColumnName("AccessUserCompany");
});
Map(m =>
{
m.ToTable("CustomerSet");
m.Properties(p => new
{
p.Id,
p.Leasing,
});
});
Map(m =>
{
m.ToTable("SiriusCustomer");
m.Properties(p => new
{
p.Id,
p.Address
});
m.Property(p => p.Id).HasColumnName("AccessUserId");
m.Property(p => p.Address).HasColumnName("SiriusAddres");
});
Map(m =>
{
m.ToTable("AccessUser");
m.Properties(p => new
{
p.Id,
p.Name,
});
m.Property(p => p.Id).HasColumnName("AccessUserId");
m.Property(p => p.Name).HasColumnName("AccessUserName");
});
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.