就像标题说EF 6不想删除表中的行(多对多关系)。
表格为:
组织
- Id(int主键)
- 名称(字符串)
组织联系(多对多)
- Id(int主键)
- OrganizationId(Organization.Id的外键不可为null)
- ContactTypeId(ContactType.Id的外键不可为null)
- 详细信息(字符串)
接触式
- Id(int主键)
- 名称(字符串可以为null)
这是代码:
using (var db = new Entities())
{
db.Database.Log = x => Debug.WriteLine(x);
var organizationDto = db.Organizations.First();
var contactDto = organizationDto.Contacts.Last();
organizationDto.Contacts.Remove(contactDto);
db.SaveChanges();
}
这是一个例外:
EntityFramework.dll中发生类型为"System.InvalidOperationException"的异常,但未在用户代码中处理
其他信息:操作失败:由于一个或多个外键属性不可为null,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为null值。如果外键不支持null值,则必须定义新的关系,必须为外键属性分配另一个非null值,或者必须删除不相关的对象。
如有任何建议,我将不胜感激。谢谢
编辑:数据库的日志。SaveChanges()显示没有对数据库的查询。
using (var db = new FIXEntities())
{
db.Database.Log = x => Debug.WriteLine(x);
var organizationDto = db.Organizations.First();
var contactDto = organizationDto.Contacts.Last();
//organizationDto.Contacts.Remove(contactDto); // not necessary
db.Entry(contactDto).State = EntityState.Deleted;
// or, like this if you prefer
db.Set<OrganizationContact>().Remove(contactDto);
db.SaveChanges();
}
仅仅从集合属性中删除它是不够的,你必须删除它。由于多对多有自己的主键,EF不知道你想删除它,它只是认为你想解除它的关联。因此,为了满足EF在异常中抱怨的FK关系,您必须将其删除。