删除一对多关系中的相关实体

时间:2012-05-12 14:08:24

标签: c# entity-framework entity-relationship one-to-many

我有这个域名:

public class Phone {
    public int Id { get; set; }
    public string Number { get; set; }
    public Person Person { get; set; }
}
public class Person {
    public int Id { get; set; }
    public IList<Phone> Phones { get; set; }
}

我加载Person并清除其Phones。但该操作会导致错误:

// actually loads person from repository...
var person = _personRepository.Include(p => p.Phones).Where(p => p.Id == 1).First();
person.Phones.Clear();
_personRepository.Update(person);

您可以在上面看到加载Person并清除其Phones的简单逻辑。但是会发生此错误:

  

操作失败:无法更改关系,因为   一个或多个外键属性是不可为空的。当一个   改变了关系,相关的外键属性是   设置为空值。如果外键不支持空值,   必须定义新的关系,外键属性必须是   分配了另一个非空值,或者不相关的对象必须是   删除。

实际上我想要清除所有Person.Phones并添加一些新项目。但我想在一个查询中清除它们,而不是逐个删除它们。

你有什么想法吗?你能帮我吗?提前谢谢。

2 个答案:

答案 0 :(得分:1)

您无法在EF中生成基于集合的SQL。因此,在EF中无法生成单个SQL语句,删除给定Phone的所有Person.Id条记录。

您可以自己编写SQL并将其传递给ObjectContext.ExecuteStoreCommandDbContext.Database.ExecuteSqlCommand,具体取决于您的模型。

答案 1 :(得分:0)

foreach(var phone in person.Phones)
{
   context.DeleteObject(phone);
}
person.Phones.Clear();

可能会有所帮助。