7

我在联系人和电话之间有一个一对多的单向关系,定义如下:

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()我得到一个例外,因为关系被定义为必需的(例如,没有联系人就不能存在电话)。
如何在不使用外键或 Phone 中的导航属性且无需在调用DbSet<Phone>.Remove(Phone)之前先调用的情况下解决此问题SaveChanges()

4

2 回答 2

1

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

  1. 取消链接对象
  2. 删除对象

EF 可能有一个聪明的方法来做到这一点,但其他人也提出了同样的问题,并得到了你提到的答案:

例如EF 4.1:从集合中删除子对象不会删除它 - 为什么?

于 2012-12-19T15:43:28.760 回答
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 });
于 2012-12-21T10:45:58.190 回答