我有这个域名:
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
并添加一些新项目。但我想在一个查询中清除它们,而不是逐个删除它们。
你有什么想法吗?你能帮我吗?提前谢谢。
答案 0 :(得分:1)
您无法在EF中生成基于集合的SQL。因此,在EF中无法生成单个SQL语句,删除给定Phone
的所有Person.Id
条记录。
您可以自己编写SQL并将其传递给ObjectContext.ExecuteStoreCommand或DbContext.Database.ExecuteSqlCommand,具体取决于您的模型。
答案 1 :(得分:0)
foreach(var phone in person.Phones)
{
context.DeleteObject(phone);
}
person.Phones.Clear();
可能会有所帮助。