首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >InvalidOperationException on SaveChanges

InvalidOperationException on SaveChanges
EN

Stack Overflow用户
提问于 2013-12-13 10:45:46
回答 3查看 897关注 0票数 1

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

我删除的代码如下所示:

代码语言:javascript
复制
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属性被设置为空值.如果foreignkey不支持空值,则必须指定一个新的关系,或者将foreignkey属性设置为不同的非空值,或者删除非相关对象。

原始消息:

ge ist fehlgeschlagen: Die Beziehung konnte nicht ge ndert werden,da für werden eine der Fremdschlüsseleigenschaften keine NULL-Werte zul ssig sind。Wenn eine Beziehung ge ndert wird,verwandteüsseleigenschaft auf einen NULL-Wert festgelegt。Wenn der Fremdschlüssel keine NULL-Werte unterstützt,muss eine neue Beziehung,die Fremdschlüsseleigenschaft einem anderen nicht -Wert zugeordnet oder das nicht verwandte Objekt gel scht。

当我附加我的对象时,关系似乎是intakt,一旦我将状态更改为删除,NavigationProperties get设置为NULL,但如果我只想要一个简单的delete命令,那么EF为什么要尝试更改关系呢?

编辑:

如下文评论所建议。我已经将我的表之间的关联设置为让级联删除,但由于某种原因,它被忽略了。

我的协会是这样的:

代码语言:javascript
复制
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

TabAdjustAccount.与TabAdjust的1:N关系

在我的示例中,我试图删除TabAdjust,一旦我将状态更改为已删除,TabAdjustAccounts导航属性就会被清除,TabAdjustAccounts属性在该行中包含项。

Edit2:

我使用的是DataBase第一种方法。

Edit3:

请看我下面的答案,也许你可以解释一下为什么这个变化会产生影响。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-13 15:30:20

不知道它是错误还是特性,但是当我从下面更改代码时:

代码语言:javascript
复制
public bool Delete()
{
    using (var context = new DbContext())
    {
        context.Set(this.GetType()).Attach(this);
        context.Entry(this).State = EntityState.Deleted;

        context.SaveChanges();
    }
}

对此:

代码语言:javascript
复制
public bool Delete()
{
    using (var context = new DbContext())
    {
        context.Set(this.GetType()).Attach(this);
        context.Set(this.GetType()).Remove(this); // <-- changed line...

        context.SaveChanges();
    }
}

一切正常工作,级联删除成功启动。

我不会接受这个答案,因为也许有人知道原因。

票数 0
EN

Stack Overflow用户

发布于 2015-05-19 09:05:24

在我自己的项目中,这个问题与甲骨文有关。在Oracle.ManagedDataAccess 4.1.112.1中,通过"context.Entry(this).State = EntityState.Deleted;“调用运行良好。

在更新到4.121.2.0相同的问题后,级联删除不再启动。

您使用“context.Set(this.GetType()).Remove(This)”的方法也适用于我。但是Oracles插入和删除对象的正确方法是:

代码语言:javascript
复制
public bool Delete()
{
    using (var context = new DbContext())
    {
        context.MyEntityType.Remove(this); 
        //context.DeleteObject(this); <- in older versioned context

        context.SaveChanges();
    }
}

Oracle Docu:插入和删除

票数 2
EN

Stack Overflow用户

发布于 2013-12-13 14:05:53

快速搜索“实体框架忽略级联删除”找到了这个答案给另一个所以问题。您可能需要在从属表上启用级联删除:

.WillCascadeOnDelete(true);

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20564575

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档