2011-03-18 102 views
19

这里是我的模型:实体框架代码优先:如何创建两个表之间的一对多和一对一关系?

public class Customer 
{ 
    public int ID { get; set; } 

    public int MailingAddressID { get; set; } 
    public virtual Address MailingAddress { get; set; } 

    public virtual ICollection<Address> Addresses { get; set; } 
} 

public class Address 
{ 
    public int ID { get; set; } 

    public int CustomerID { get; set; } 
    public virtual Customer Customer { get; set; } 
} 

顾客可以有任意数量的地址,但是只有一个地址可以是一个邮寄地址。

我可以得到一对一的关系,一对多的工作很好,如果我只使用一个,但是当我尝试并引入我在地址表上得到多个CustomerID键(CustomerID1,CustomerID2,CustomerID3)。我真的把头发撕掉了。

为了映射我使用我知道你在想弄清楚这样的实体框架的方式在这里描述的方法http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part-3-one-to-one-foreign-key-associations.aspx

回答

18

我这个奋斗了几乎整整一天,当然我只是等待,最后才在这里提出想出来的!

除了在该博客中展示的One to One的实现之外,我还需要使用流利的api来指定多对多,因为仅存在这种约定并不足以满足一对一关系。

modelBuilder.Entity<Customer>().HasRequired(x => x.PrimaryMailingAddress) 
    .WithMany() 
    .HasForeignKey(x => x.PrimaryMailingAddressID) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<Address>() 
    .HasRequired(x => x.Customer) 
    .WithMany(x => x.Addresses) 
    .HasForeignKey(x => x.CustomerID); 

这里是在数据库中的最终模型: enter image description here

2

的一对一的关系,但如果我在设计这个我会建议不要将MailingAddress连接到数据库。只是让计算特性如下:

public MailingAddress { 
    get { 
     return Addresses.Where(a => a.IsPrimaryMailing).FirstOrDefault(); 
    } 
} 
+2

然而,这产生具有维护,只有一个'Address'有问题'IsPrimaryMailing = TRUE;它可以很容易出问题。 – georgiosd 2012-05-14 13:13:57

相关问题