我的数据库中有两个表由外键连接:Page(PageId,其他数据)和PageTag(PageId,Tag).我已经使用LINQ为这些表生成类,其中页面作为父级,Tag作为子集合(一对多关系).有没有办法在Page类中从数据库中标记要删除的PageTag记录?
快速清除:
我希望在父DataContext调用SubmitChanges()之前删除子对象,而不是之前.我希望TagString的行为与Page对象的任何其他属性完全相同.
我想启用如下代码:
Page page = mDataContext.Pages.Where(page => page.pageId = 1);
page.TagString = "new set of tags";
//Changes have not been written to the database at this point.
mDataContext.SubmitChanges();
//All changes should now be saved to the database.
Run Code Online (Sandbox Code Playgroud)
以下是我的详细情况:
为了更容易地处理标记集合,我在Page对象中添加了一个属性,将Tag集合视为字符串:
public string TagString {
get {
StringBuilder output = new StringBuilder();
foreach (PageTag tag in PageTags) {
output.Append(tag.Tag + " ");
}
if (output.Length > 0) {
output.Remove(output.Length - 1, 1);
}
return output.ToString();
}
set {
string[] tags = value.Split(' ');
PageTags.Clear();
foreach (string tag in tags) {
PageTag pageTag = new PageTag();
pageTag.Tag = tag;
PageTags.Add(pageTag);
}
}
}
Run Code Online (Sandbox Code Playgroud)
基本上,这个想法是当一串标签被发送到这个属性时,该对象的当前标签将被删除,并在它们的位置生成一个新的集合.
我遇到的问题是这一行:
PageTags.Clear();
Run Code Online (Sandbox Code Playgroud)
实际上,在提交更改时,不会从数据库中删除旧标记.
环顾四周,删除事物的"正确"方法似乎是调用数据上下文类的DeleteOnSubmit方法.但我似乎无法从Page类中访问DataContext类.
有没有人知道如何在Page类中标记要从数据库中删除的子元素?
经过一些研究,我相信我已经设法找到了解决方案.将对象从集合中删除时标记要删除的对象由Association属性的DeleteOnNull参数控制.
当使用OnDelete Cascade标记两个表之间的关系时,此参数设置为true.
遗憾的是,无法在设计器中设置此属性,也无法在*DataContext.cs文件的部分类中设置它.在不启用级联删除的情况下设置它的唯一方法是手动编辑*DataContext.designer.cs文件.
在我的例子中,这意味着找到页面关联,并添加DeleteOnNull属性:
[Association(Name="Page_PageTag", Storage="_Page", ThisKey="PageId", OtherKey="iPageId", IsForeignKey=true)]
public Page Page
{
...
}
Run Code Online (Sandbox Code Playgroud)
并添加DeleteOnNull属性:
[Association(Name="Page_PageTag", Storage="_Page", ThisKey="PageId", OtherKey="iPageId", IsForeignKey=true, DeleteOnNull = true)]
public Page Page
{
...
}
Run Code Online (Sandbox Code Playgroud)
请注意,该属性需要添加到PageTag类的Page属性,而不是相反.
另请参阅:
Beth Massi - LINQ to SQL和一对多关系
Dave Brace - LINQ to SQL:DeleteOnNull