使用以下数据库架构:
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;
}
答案 0 :(得分:1)
您的奴隶仍然存在,他的FK列master_id需要一个值。如果要完全删除它,则需要告知EF删除它,而不是将其从父项中删除。如果您不想删除它,请指定一个新的master_id或将此列设置为可为空。
答案 1 :(得分:1)
您的从属表中仍有一个从属对象在masterId列中没有设置值。
尝试使用ctx.DeleteObject(newSlave)
来摆脱它。