这个问题与我之前的问题有关。你可以在那里找到几乎所有的代码,除了这里报告的异常。我用 int 字段替换了可为空的字段,并且生成的代码将 null 我放在 -1 的位置。通过这种方式,我设法解决了 DbLinq 代码引发的恼人异常。但现在我不能删除子实体!特别是,我有一个与一些地址相关的患者。表 PatientAddresses 包含三元组中的所有地址(PatientID、Address、DomicileStatus),其中前两个成员构成表的主键。我写了一个测试来指出这个问题:
static void TestAddresses()
{
Patient p1 = CreateRandomPatient();
PatientAddress a1 = CreateRandomAddress();
p1.Addresses.Add(a1);
Database.Source.Patients.InsertOnSubmit(p1);
TestUtility.SaveCloseAndReopen();
Patient p2 = Database.Source.Patients.Single(p => p.ID == p1.ID);
Debug.Assert(p2.Addresses.Count == 1);
Debug.Assert(p2.Addresses[0].PatientID == a1.PatientID && p2.Addresses[0].Address.Equals(a1.Address));
Debug.Assert(Database.Source.PatientsAddresses.Where(a => a.PatientID == a1.PatientID && a.Address == a1.Address).Count() > 0);
p2.Addresses.RemoveAt(0);
TestUtility.SaveCloseAndReopen();
p2 = Database.Source.Patients.Single(p => p.ID == p1.ID);
Debug.Assert(p2.Addresses.Count == 0); // <-- HERE
Debug.Assert(!Database.Source.PatientsAddresses.Contains(a1));
}
测试在指示的行失败。长话短说,即使我删除了一个地址,它也会保留在数据库中。我什至尝试删除相应的 PatientAddress 行,但无济于事。我尝试了三个或四个变体,但我无法删除患者的地址。用于生成这些表的代码如下:
create table Patients (
ID integer primary key,
FirstName text not null,
LastName text not null,
Profession text,
IsMarried integer not null default 0,
HasChildren integer not null default 0,
Birthday integer not null
);
create table PatientsAddresses (
PatientID integer,
Address text,
DomicileStatus text,
primary key (PatientID, Address),
foreign key (PatientID) references Patients(ID)
on delete cascade
on update cascade
);
我想不出避免这种行为的方法,谷歌也无济于事。