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

C# 为什么EntityCollection.Remove()会导致SaveChanges()引发InvalidOperationException?,c#,entity-framework,sqlite,C#,Entity Framework,Sqlite,使用以下DB模式: 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 maste

使用以下DB模式:

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;
}

您的从属服务器仍然存在,并且其FK列主服务器id需要一个值。如果您想完全删除它,您需要告诉EF将其删除,而不是将其从其父级中删除。如果不想删除它,请指定一个新的主id或将此列设置为可空。

在从属表中仍然有一个从属对象在主id列中没有设置值


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

当我添加从属对象时,我不必调用
AddObject
,但是当我删除它时,我需要调用
DeleteObject
。@Ludo我想
CreateSlave()
方法已经为您添加了对象,或者更确切地说是添加到主对象。也许他们决定在删除时更明确?你不想不小心删除一些你只想分配给其他主机的东西,我想不会的。我用它的定义更新了我的问题。@Ludo这就是我编辑我的评论的原因,添加到master中可能会做到这一点。不幸的是,我不能删除CreateSave部分了。DeleteObject有效吗?是的,您似乎是对的:不需要插入
AddObject
,但需要调用
DeleteObject
来删除。更重要的是,似乎只有
DeleteObject
是必需的,因为它将对象从
EntityCOllection
中删除。