我正在尝试删除我的一个实体,但我收到了一个奇怪的错误。
我删除的代码如下所示:
public bool Delete()
{
using (var context = new DbContext())
{
context.Set(this.GetType()).Attach(this);
context.Entry(this).State = EntityState.Deleted;
context.SaveChanges();
}
}
此方法是我的实体的一部分,它附加自身(当前实体)并将状态更改为已删除。
在 context.SaveChanges(); 行上,我收到错误消息:
翻译消息(我自己的翻译):
执行被中止:关系无法更改,因为对于至少一个foreignkey属性,不允许使用NULL值。修改关系时,相关的foreignkey属性设置为NULL值。如果foreignkey不支持NULL值,则必须指定新关系或将foreignkeyproperty设置为不同的NON-NULL值,否则将删除非相关对象。
原始讯息:
Der Vorgang ist fehlgeschlagen:Die Beziehung konntenichtgeändertwerden,dafürmindestenseinederFremdschlüsseleigenschaftenkeineNULL-Wertezulässigind。 Wenn eineBeziehunggeändertwird,wird dieverwandteFremdschlüsseleigenschaftaufeinen NULL-Wert festgelegt。 WennderFremdschlüsselkeineNULL-Werteunterstützt,muss eine neue Beziehung definiert,dieFremdschlüsseleigenschaftineineanderen Nicht-NULL-Wert zugeordnet oder das nicht verwandteObjektgelöschtwerden。
当我附加我的对象时,关系似乎是凹进的,一旦我将状态更改为Deleted,NavigationProperties将设置为NULL,但是当我想要一个简单的删除命令时,为什么EF会尝试更改关系?
修改
根据以下评论中的建议。 我已经在我的表之间设置了关联以删除级联,但由于某种原因它会被忽略。
这就是我的协会的样子:
End1 Multiplicity - 1 (One of TabAdjust)
End1 Navigation Property - TabAdjustAccounts
End1 OnDelete - Cascade
End1 Role Name - TabAdjsut
End2 Multiplicity - * (collection of TabAdjustAccount)
End2 Navigation Property - TabAdjust
End2 OnDelete - None
End2 Role Name - TabAdjustAccount
Name - CS_TABADJUSTTABADJUSTACCOUNT
Referential Contraint - TabAdjust -> TabAdjustAccount
TabAdjust 与 TabAdjustAccount 之间的1:N关系。
在我的示例中,我尝试删除TabAdjust,一旦我将TabAdjustAccounts属性中的项目更改为删除状态,TabAdjustAccounts导航属性就会被清除。
EDIT2:
我正在使用DataBase第一种方法。
EDIT3:
请参阅下面的答案,也许您可以解释为什么这种变化会产生影响。
答案 0 :(得分:2)
在我自己的项目中,这个问题与oracle有关。在Oracle.ManagedDataAccess 4.1.112.1中通过" context.Entry(this)调用.State = EntityState.Deleted; "工作得很好。
更新到4.121.2.0后发生同样的问题,级联删除不再被解雇。
使用" context.Set(this.GetType())的方法。删除(this); "也为我工作。但是,Oracles正确的插入和删除对象的方法是:
public bool Delete()
{
using (var context = new DbContext())
{
context.MyEntityType.Remove(this);
//context.DeleteObject(this); <- in older versioned context
context.SaveChanges();
}
}
答案 1 :(得分:0)
快速搜索&#34;实体框架忽略级联删除&#34;找到this answer到另一个SO question。您可能需要在依赖表上启用级联删除:
.WillCascadeOnDelete(true);
答案 2 :(得分:0)
不知道它是否是一个错误或功能,但是当我从这里更改我的代码时:
public bool Delete()
{
using (var context = new DbContext())
{
context.Set(this.GetType()).Attach(this);
context.Entry(this).State = EntityState.Deleted;
context.SaveChanges();
}
}
对此:
public bool Delete()
{
using (var context = new DbContext())
{
context.Set(this.GetType()).Attach(this);
context.Set(this.GetType()).Remove(this); // <-- changed line...
context.SaveChanges();
}
}
一切正常,级联删除成功。
我不接受这个作为答案,因为也许有人知道为什么。