此问题与我的previous one有关。您可以在那里找到几乎所有代码,但此处报告的例外情况。我用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
);
我无法找到避免这种行为的方法,谷歌也无济于事。