如何从LINQ to SQL中删除子集合中的记录?

Aar*_*ieb 3 linq linq-to-sql

我的数据库中有两个表由外键连接: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类中标记要从数据库中删除的子元素?

Aar*_*ieb 6

经过一些研究,我相信我已经设法找到了解决方案.将对象从集合中删除时标记要删除的对象由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