C# 实体框架不';我不想删除具有多对多关系的表中的行
正如标题所说,EF6不想删除表中的行(多对多关系) 表格如下: 组织机构C# 实体框架不';我不想删除具有多对多关系的表中的行,c#,sql,database,entity-framework,C#,Sql,Database,Entity Framework,正如标题所说,EF6不想删除表中的行(多对多关系) 表格如下: 组织机构 Id(int主键) 名称(字符串) 组织联系人(多对多) Id(int主键) OrganizationId(Organization.Id的外键不可为空) ContactTypeId(ContactType.Id的外键不可为空) 详细信息(字符串) 接触式 Id(int主键) 名称(字符串可为空) 代码如下: using (var db = new Entities()) { db.Database.Lo
- Id(int主键)
- 名称(字符串)
- Id(int主键)
- OrganizationId(Organization.Id的外键不可为空)
- ContactTypeId(ContactType.Id的外键不可为空)
- 详细信息(字符串)
- Id(int主键)
- 名称(字符串可为空)
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。对关系进行更改时,相关外键属性设置为空值。如果外键不支持空值,则必须定义新的关系,必须为外键属性分配另一个非空值,或者必须删除不相关的对象
如有任何建议,我将不胜感激。谢谢
编辑:
db.SaveChanges()的日志显示没有对数据库的查询。使用(var db=new FIXEntities())
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();
}
{
db.Database.Log=x=>Debug.WriteLine(x);
var organizationDto=db.Organizations.First();
var contactDto=organizationDto.Contacts.Last();
//organizationDto.Contacts.Remove(contactDto);//不需要
db.Entry(contactDto).State=EntityState.Deleted;
//或者,如果你愿意的话,像这样
db.Set().Remove(contactDto);
db.SaveChanges();
}
仅将其从集合属性中删除是不够的,必须将其删除。由于您的多对多有自己的主键,EF不知道您希望删除它,它只是认为您希望它解除关联。因此,您必须删除它,以满足EF在异常中抱怨的FK关系。使用(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);//不需要
db.Entry(contactDto).State=EntityState.Deleted;
//或者,如果你愿意的话,像这样
db.Set().Remove(contactDto);
db.SaveChanges();
}
仅将其从集合属性中删除是不够的,必须将其删除。由于您的多对多有自己的主键,EF不知道您希望删除它,它只是认为您希望它解除关联。因此,您必须将其删除,以满足EF在异常中抱怨的FK关系。当您删除
联系人时,是否希望删除级联?删除一个联系人
可能会留下一个OrganizationContact
行,该行指向联系人
中不存在的行。实际上,我正在尝试删除OrganizationContact行,我只想删除OrganizationContact中的行,不想再删除任何内容。当您删除联系人
时,是否要级联删除?删除一个联系人
可能会留下一个OrganizationContact
行,该行指向联系人
中不存在的行。实际上,我正在尝试删除OrganizationContact行,我只想删除OrganizationContact中的行。