与Code First的单向一对多关系

时间:2012-12-19 15:20:33

标签: c# .net entity-framework ado.net ef-code-first

我在Contact和Phone之间有一对多的单向关系,如下所示:

class Contact {
    int ContactId {get; set}
    ICollection<Phone> Phones {get; set}
}
class Phone {
    int PhoneId {get; set;}
    string PhoneNumber {get; set;}
}

现在在域层中,我尝试执行以下操作:

someContact.Phones.Remove(somePhone);

当我尝试拨打context.SaveChanges()时,我得到一个例外,因为这种关系被定义为必需(例如,没有联系人就不能存在电话)。
如何在不使用电话中的外键或导航属性的情况下解决此问题,而无需在致电DbSet<Phone>.Remove(Phone)之前致电SaveChanges()

2 个答案:

答案 0 :(得分:1)

你基本上回答了自己的问题,因为你描述的两件事是分开的:

  1. 取消关联对象
  2. 删除对象
  3. EF可能有一种聪明的方法可以做到这一点,但是其他人也提出了同样的问题并得到了你提到的答案:

    e.g。 EF 4.1: Removing child object from collection does not delete it - why?

答案 1 :(得分:0)

有一种方法可以完成Matthew在一步中描述的两种镫骨。它需要对模型进行一些更改 - 您必须向Phone实体添加外键并创建包含PhoneIdContactId的复合键。

这使Phone类的实例绑定到Contact类的实例。使用这些设置,当您从联系人someContact.Phones.Remove(somePhone);中删除手机时,EF会从手机中删除手机,因为它知道手机在没有连接到该特定联系人的情况下无法存在。

<强>型号:

public class Contact {
    public int ContactId { get; set; }
    public virtual ICollection<Phone> Phones { get; set; }
}

public class Phone {
    public int PhoneId { get; set; }
    public int ContactId { get; set; }
    public string PhoneNumber { get; set; }
}

<强>配置:

modelBuilder.Entity<Contact>()
    .HasMany(o => o.Phones)
    .WithRequired()
    .HasForeignKey(f => f.ContactId)
    .WillCascadeOnDelete(true);

modelBuilder.Entity<Phone>()
    .HasKey(o => new { o.PhoneId, o.ContactId });