Невозможно удалить дочерние объекты с помощью DbLinq

Этот вопрос связан с моим предыдущим. Вы можете найти практически весь код там, за исключением описанных здесь. Я заменил поля, допускающие значение null, на поля 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
);

Я не могу найти способ избежать этого поведения, и Google не помогает.


person Totem    schedule 25.09.2012    source источник
comment
Как выглядит база данных после этого? Он вообще обновляется? Ссылаются ли PatientAddresses на PatientID?   -  person Bobson    schedule 26.09.2012
comment
Да, записи адресов по-прежнему относятся к правильному идентификатору пациента.   -  person Totem    schedule 26.09.2012
comment
Я. есть несколько виновников DbLinq. Недавно я разрабатываю приложение pos с помощью Sqlite и DbLinq. Я обнаружил, что каждая таблица не может иметь более 1 точки внешнего ключа на одну и ту же таблицу. Также .SubmitChanges не вызывает удаление, если коллекция меньше предыдущей. Microsoft Linq справится с этим автоматически.   -  person yancyn    schedule 01.11.2013