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

时间:2015-03-10 01:00:03

标签: c# sql .net entity-framework

请原谅标题,因为我不确定正确描述问题所需的措辞。

我有一个客户表,一个电子邮件地址表,一个电子邮件地址类型表和匹配的模型。

  

客户表
  CustomerId,名字,姓氏

     

电子邮件地址表
  EmailAddressId,EmailAddress,EmailAddressType,CustomerId

     

EmailAddressType表
  EmailAddressTypeId,Description

我想在我的客户模型中添加属性“主电子邮件”,“辅助电子邮件”,“第三电子邮件”地址,但在确定如何正确编码时存在问题。

我确实意识到我想要做的事情不符合数据库中表格的关系类型。这是临时解决方案的业务需求,直到我们可以重新编写所有这些逻辑。

2 个答案:

答案 0 :(得分:1)

这是我的解决方案:跳过EmailAddressType表,我假设二级和三级电子邮件地址是可选的,主电子邮件是必填字段。 Customer表和EmailAddress表之间的关系在OnModelCreating方法中配置。

       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);
            }
        }

答案 1 :(得分:0)

对于我想要做的事情,似乎并不是原生的解决方案。

所以我最后将它们添加为非映射设置,只使用linq从我添加的一对多中检索。