如何将模型属性映射到外表关系

本文关键字:关系 映射 属性 模型 | 更新日期: 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 从我添加的一对多中检索。