如何将模型属性映射到外表关系
本文关键字:关系 映射 属性 模型 | 更新日期: 2024-11-05 19:37:59
请原谅标题,因为我不确定正确描述问题所需的措辞。
我有一个客户表、一个电子邮件地址表、一个电子邮件地址类型表和匹配的模型。
客户表
客户 ID、名字、姓氏电子邮件地址表
EmailAddressId, EmailAddress, EmailAddressType, CustomerId电子邮件地址类型表
电子邮件地址类型 ID, 描述
我想将属性"主电子邮件"、"辅助电子邮件"、"第三电子邮件"地址添加到我的客户模型中,但在弄清楚如何正确编码时遇到问题。
我确实意识到我想做的事情不适合数据库中表的关系类型。这是临时解决方案的业务要求,直到我们可以重新编码所有这些逻辑。
这是我的解决方案:跳过了电子邮件地址类型表,我假设二级和三级电子邮件地址是可选的,主电子邮件是必填字段。客户表和电子邮件地址表之间的关系在 OnModelCreate 方法中配置。
public class Customer
{
public int CustomerId { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public virtual EmailAddress PrimaryAddress { get; set; }
public virtual EmailAddress SecondaryAddress { get; set; }
public virtual EmailAddress TeritaryAddress { get; set; }
}
public class EmailAddress
{
public int EmailAddressId { get; set; }
public string Address { get; set; }
}
public class ShoppingDb : DbContext
{
public DbSet<Customer> Customers { get; set; }
public DbSet<EmailAddress> Addresses { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
var customerEntity= modelBuilder.Entity<Customer>();
customerEntity.HasKey(c => c.CustomerId);
customerEntity.Property(c => c.FirstName).HasMaxLength(50);
customerEntity.Property(c => c.LastName).HasMaxLength(50);
customerEntity.HasRequired(c =>
c.PrimaryAddress).WithRequiredDependent();
customerEntity.HasOptional(c => c.SecondaryAddress).WithOptionalDependent();
customerEntity.HasOptional(c => c.TeritaryAddress).WithOptionalDependent();
var addressEntity = modelBuilder.Entity<EmailAddress>();
addressEntity.HasKey(c => c.EmailAddressId);
addressEntity.Property(c => c.Address).HasMaxLength(200);
}
}
对于我想做的事情,似乎没有原生解决方案。
因此,我最终将它们添加为非映射设置,这些设置仅使用 linq 从我添加的一对多中检索。