SaveChanges上的InvalidOperationException

时间:2013-12-13 10:45:47

标签: c# entity-framework entity-framework-5 savechanges

我正在尝试删除我的一个实体,但我收到了一个奇怪的错误。

我删除的代码如下所示:

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:

请参阅下面的答案,也许您可​​以解释为什么这种变化会产生影响。

3 个答案:

答案 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();
    }
}

Oracle Docu: inserting and deleting

答案 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();
    }
}

一切正常,级联删除成功。

我不接受这个作为答案,因为也许有人知道为什么。