C# LINQ到SQL多对多关系插入和删除问题
我尝试在Windows Phone 7.1上使用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,
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
}