0

这个问题与我之前的问题有关。你可以在那里找到几乎所有的代码,除了这里报告的异常。我用 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
);

我想不出避免这种行为的方法,谷歌也无济于事。

4

0 回答 0