C# LINQ到SQL多对多关系插入和删除问题

C# LINQ到SQL多对多关系插入和删除问题,c#,linq-to-sql,windows-phone-7,many-to-many,C#,Linq To Sql,Windows Phone 7,Many To Many,我尝试在Windows Phone 7.1上使用LINQ到SQL对以下关系进行建模: create table x (id INTEGER PRIMARY KEY AUTOINCREMENT, text STRING); create table y (id INTEGER PRIMARY KEY AUTOINCREMENT, text STRING); create table z (id INTEGER PRIMARY KEY AUTOINCREMENT,

我尝试在Windows Phone 7.1上使用LINQ到SQL对以下关系进行建模:

create table x (id INTEGER PRIMARY KEY AUTOINCREMENT, text STRING);
create table y (id INTEGER PRIMARY KEY AUTOINCREMENT, text STRING);
create table z (id INTEGER PRIMARY KEY AUTOINCREMENT, 
                x_id INTEGER NOT NULL,
                y_id INTEGER NOT NULL, 
                FOREIGN KEY(x_id) REFERENCES x(id) ON DELETE CASCADE, 
                FOREIGN KEY(y_id) REFERENCES y(id) ON DELETE CASCADE);
所以,如果我在z表中有一条记录,那么每当我删除id为x_id的x记录或id为y_id的y记录时,它都应该被删除

我有以下C代码(基于示例):

但这段代码(我希望是等效的)没有:

using (MyDatabase db = new MyDatabase(KDBConnectionString))
{
    if (!db.DatabaseExists())
    {
        db.CreateDatabase();
    }

    X x = new X();
    db.Xs.InsertOnSubmit(x);

    Y y = new Y();
    db.Ys.InsertOnSubmit(y);

    Z z = new Z() { X = x, Y = y };
    db.Zs.InsertOnSubmit(z);
    db.SubmitChanges();

    Assert.IsTrue(db.Xs.Count() == 1, "no x");
    Assert.IsTrue(db.Ys.Count() == 1, "no y");
    Assert.IsTrue(db.Zs.Count() == 1, "no z");

    Assert.IsTrue(db.Xs.First().Zs.Count() == 1, "no z in x"); // fails here
    Assert.IsTrue(db.Ys.First().Zs.Count() == 1, "no z in y");
}
级联删除没有像我预期的那样工作。这项工作:

using (MyDatabase db = new MyDatabase(KDBConnectionString))
{
    if (!db.DatabaseExists())
    {
        db.CreateDatabase();
    }

    X x = new X();
    db.Xs.InsertOnSubmit(x);

    Y y = new Y();
    db.Ys.InsertOnSubmit(y);

    Z z = new Z();
    x.Zs.Add(z);
    y.Zs.Add(z);
    db.SubmitChanges();

    db.Zs.DeleteOnSubmit(z);
    db.SubmitChanges();

    Assert.IsTrue(db.Zs.Count() == 0, "z not deleted");
    Assert.IsTrue(x.Zs.Count() == 0, "z not removed from x");
    Assert.IsTrue(y.Zs.Count() == 0, "z not removed from y");
}
这并不是:

using (MyDatabase db = new MyDatabase(KDBConnectionString))
{
    if (!db.DatabaseExists())
    {
        db.CreateDatabase();
    }

    X x = new X();
    db.Xs.InsertOnSubmit(x);

    Y y = new Y();
    db.Ys.InsertOnSubmit(y);

    Z z = new Z();
    x.Zs.Add(z);
    y.Zs.Add(z);
    db.SubmitChanges();

    db.Xs.DeleteOnSubmit(x);
    db.SubmitChanges();

    Assert.IsTrue(db.Zs.Count() == 0, "z not deleted"); // ...this works, so "CASCADE" parameter has some effect
    Assert.IsTrue(y.Zs.Count() == 0, "z not removed from y"); // ... but fails here, so something is off
}

我想我在外键定义上有一些简单的错误,但我自己找不到,而且我的Google Fu今天很弱。非常感谢所有帮助。

我已经解决了插入问题,可以在这里找到带有测试的示例代码:


显然,我不支持以我想要的方式删除。正如问题的答案中所建议的,我已经尝试过DeleteOnNull属性,但它就是不起作用。

我已经解决了插入问题,测试的示例代码可以在这里找到:

显然,我不支持以我想要的方式删除。正如在问题的答案中所建议的,我已经尝试过DeleteOnNull属性,但它就是不起作用

using (MyDatabase db = new MyDatabase(KDBConnectionString))
{
    if (!db.DatabaseExists())
    {
        db.CreateDatabase();
    }

    X x = new X();
    db.Xs.InsertOnSubmit(x);

    Y y = new Y();
    db.Ys.InsertOnSubmit(y);

    Z z = new Z();
    x.Zs.Add(z);
    y.Zs.Add(z);
    db.SubmitChanges();

    db.Zs.DeleteOnSubmit(z);
    db.SubmitChanges();

    Assert.IsTrue(db.Zs.Count() == 0, "z not deleted");
    Assert.IsTrue(x.Zs.Count() == 0, "z not removed from x");
    Assert.IsTrue(y.Zs.Count() == 0, "z not removed from y");
}
using (MyDatabase db = new MyDatabase(KDBConnectionString))
{
    if (!db.DatabaseExists())
    {
        db.CreateDatabase();
    }

    X x = new X();
    db.Xs.InsertOnSubmit(x);

    Y y = new Y();
    db.Ys.InsertOnSubmit(y);

    Z z = new Z();
    x.Zs.Add(z);
    y.Zs.Add(z);
    db.SubmitChanges();

    db.Xs.DeleteOnSubmit(x);
    db.SubmitChanges();

    Assert.IsTrue(db.Zs.Count() == 0, "z not deleted"); // ...this works, so "CASCADE" parameter has some effect
    Assert.IsTrue(y.Zs.Count() == 0, "z not removed from y"); // ... but fails here, so something is off
}