【问题标题】:Entity Framework Code First: How can I create a One-to-Many AND a One-to-One relationship between two tables?实体框架代码优先:如何在两个表之间创建一对多和一对一的关系?
【发布时间】:2011-03-18 08:58:44
【问题描述】:

这是我的模型:

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

【问题讨论】:

    标签: c# entity-framework entity-framework-ctp5


    【解决方案1】:

    我几乎一整天都在为此苦苦挣扎,当然我要等着在这里问,然后才最终弄清楚!

    除了实现该博客中演示的一对一之外,我还需要使用流利的 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);
    

    这是数据库中的最终模型:

    【讨论】:

      【解决方案2】:

      我知道您正在尝试找出 Entity Framework 执行此操作的方法,但如果我正在设计此方法,我建议您甚至不要将 MailingAddress 连接到数据库。只需将其设为这样的计算属性:

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

      【讨论】:

      • 然而,这会产生一个问题,即必须维护只有一个Address 具有IsPrimaryMailing = true,这很容易出错。
      猜你喜欢
      • 2015-04-09
      • 1970-01-01
      • 2021-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多