我在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()
?
答案 0 :(得分:1)
你基本上回答了自己的问题,因为你描述的两件事是分开的:
EF可能有一种聪明的方法可以做到这一点,但是其他人也提出了同样的问题并得到了你提到的答案:
e.g。 EF 4.1: Removing child object from collection does not delete it - why?
答案 1 :(得分:0)
有一种方法可以完成Matthew在一步中描述的两种镫骨。它需要对模型进行一些更改 - 您必须向Phone
实体添加外键并创建包含PhoneId
和ContactId
的复合键。
这使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 });