实体框架代码优先:如何在两个表之间创建一对多和一对一的关系?

Luc*_*Sam 19 c# entity-framework entity-framework-ctp5

这是我的模型:

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; }
}
Run Code Online (Sandbox Code Playgroud)

客户可以拥有任意数量的地址,但这些地址中只有一个可以是邮寄地址.

如果我只使用一个,我可以得到One to One关系,One to Many工作得很好,但是当我尝试介绍两者时,我在Addresses表上获得了多个CustomerID键(CustomerID1,CustomerID2,CustomerID3).我真的把头发撕成了这个.

为了映射一对一的关系,我使用这里描述的方法http://weblogs.asp.net/manavi/archive/2011/01/23/associations-in-ef-code-first-ctp5-part- 3,一到一个外键,associations.aspx

Luc*_*Sam 18

我几乎整天都在努力解决这个问题,当然我等到最终搞清楚之后再问这里!

除了实现博客中展示的一对一之外,我还需要使用流畅的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);
Run Code Online (Sandbox Code Playgroud)

这是数据库中的最终模型: 在此输入图像描述