0

この質問は私の前の質問に関連してます。ここで報告されている例外を除いて、ほとんどすべてのコードをそこに見つけることができます。null許容フィールドをintフィールドに置き換え、生成されたコードがnullを置く場所に-1を入れました。このようにして、DbLinqコードによって発生する厄介な例外を解決することができました。しかし、今は子エンティティを削除できません!特に、いくつかの住所が関連付けられている患者がいます。テーブルPatientAddressesは、すべてのアドレスをトリプレット(PatientID、Address、DomicileStatus)で保持し、最初の2つのメンバーがテーブルの主キーを構成します。私は問題を指摘するためにテストを書きました:

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行を削除しようとしましたが、役に立ちませんでした。3つまたは4つのバリアントを試しましたが、患者から住所を削除できません。これらのテーブルを生成するために使用されるコードは次のとおりです。

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