以下是数据库架构:
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文件。 接着我添加了一条主记录和一条从记录,这个操作很顺利。但是当我尝试删除从记录时,却出现了异常,我不知道为什么。请注意保留HTML标记。
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
异常消息为:
操作失败:由于一个或多个外键属性是非空的,因此无法更改关系。当对关系进行更改时,相关的外键属性将设置为 null 值。如果外键不支持 null 值,则必须定义新的关系、分配另一个非 null 值给外键属性,或删除不相关的对象。
我做错了什么?
编辑:
这里是由 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;
}
AddObject
,但是当我删除它时,我需要调用DeleteObject
吗? - user610650CreateSlave()
方法已经为您添加了对象,或者说添加到了主对象中。也许他们决定在删除时更加明确会更好?您不希望意外删除刚想分配给其他主对象的东西。 - Botz3000AddObject
来插入,但是需要调用DeleteObject
来删除。更进一步,看起来只有DeleteObject
是必要的,因为它会从EntityCollection
中删除该对象。 - user610650