为什么EntityCollection.Remove()会导致SaveChanges()引发InvalidOperationException?

时间:2012-07-03 10:54:40

标签: c# entity-framework sqlite

使用以下数据库架构:

CREATE TABLE master (
    id integer primary key autoincrement, 
    title text);
CREATE TABLE slave (
    id integer primary key autoincrement, 
    master_id integer not null, 
    title text, 
    foreign key (master_id) references master (id));

我创建了一个sqlite数据库,然后我用它创建了一个Entity Framework .edmx文件。

然后我添加一个主记录和一个奴隶记录,它工作正常,然后我尝试删除从记录,但这引发了异常,我不知道为什么。

var ctx = new blaEntities();
var newMaster = master.Createmaster(0);
ctx.masters.AddObject(newMaster);

var newSlave = slave.Createslave(0, 0);
newMaster.slaves.Add(newSlave);

ctx.SaveChanges(); // works fine, both id and master_id properties of newMaster 
                   // and newSlave are then set with generated values.

newMaster.slaves.Remove(newSlave);

ctx.SaveChanges(); // InvalidOperationException is raised

例外的消息是:

  

操作失败:无法更改关系,因为   一个或多个外键属性是不可为空的。当一个   改变了关系,相关的外键属性是   设置为空值。如果外键不支持空值,   必须定义新的关系,外键属性必须是   分配了另一个非空值,或者不相关的对象必须是   删除。

我做错了什么?

修改

这是由EF Createslave(...)方法生成的:

public static slave Createslave(global::System.Int64 id, global::System.Int64 master_id)
{
    slave slave = new slave();
    slave.id = id;
    slave.master_id = master_id;
    return slave;
}

2 个答案:

答案 0 :(得分:1)

您的奴隶仍然存在,他的FK列master_id需要一个值。如果要完全删除它,则需要告知EF删除它,而不是将其从父项中删除。如果您不想删除它,请指定一个新的master_id或将此列设置为可为空。

答案 1 :(得分:1)

您的从属表中仍有一个从属对象在masterId列中没有设置值。

尝试使用ctx.DeleteObject(newSlave)来摆脱它。