通过更新父对象,删除Linq to SQL中的相关对象

时间:2014-07-04 10:22:34

标签: c# linq-to-sql

当我想添加新的相关对象时,我可以使用此方法:

  • 从数据库中提取父对象
  • 找到属性(我相信它是EntitySet)与另一个模型保持一对多的关系,
  • 在那里插入一个新的子对象
  • 最后保存父类

示例:

var post = db.Post.Single(x => x.Id == 1);
post.Tag.Add(new Tag(){ name="Brand new!" };
db.SubmitChanges();

与简单地将子对象直接添加到数据库相比,这可能看起来有些麻烦,但是当必须使用通用服务(意味着对控制器内的DBContext的访问被遮挡)来处理数据库操作时,它可以实际上很方便(有时候)。

现在,是否可以以类似方式删除相关对象?

我记得之前尝试过这个想法,但从未成功(我认为异常提到了将对象作为失败原因附加到数据库的事实)。

我知道我可以简单地写一下:

var model = db.Tag.Single(x => x.PostId == 1 && name == "Brand new!");
db.Tag.DeleteOnSubmit(model);
db.SubmitChanges();

并完成它。在我的项目环境中,这些代码将被放置在继承自通用服务的自定义服务中。关键是,我只想知道在更新父对象时是否可以删除相关对象。如果可能的话,这可能会帮助我更快地生成一些原型代码,如果不是,我只是以标准方式处理它。

2 个答案:

答案 0 :(得分:0)

var model = db.Tag.Single(x => x.PostId == 1 && name == "Brand new!");
db.Tag.DeleteObject(model);
db.SubmitChanges();

是你需要的。

或者你也可以这样:

db.Tag.Where(x => x.PostId == i && name == "Brand New!").ToList().ForEach(Tag.Tag.DeleteObject); db.SaveChanges();

或者这种方式也应该有效:

db.Tag.Delete(x => x.PostId == 1 && name == "Brand new!");

答案 1 :(得分:0)

也许我的帖子会帮助某人:)

假设您在Post和Tag之间有一个nullalbe外键,并且通过Tag.PostID == Post.ID

进行关联

我这样做:在您的代码中,您只需从集合中删除子项(正如您所希望的那样):

var post = db.Post.Single(x => x.Id == 1);
Tag tagToRemove = post.Tag.First();//select a tag to remove
post.Tag.Remove(tagToRemove);

//Somewhere you call submit
db.SubmitChanges();

在此之后(如果您的外键可以为空),您将在DB中使用PostID == null标记。为避免这种情况,您可以使用一个部分方法扩展DataContext类:

public partial class YourDataContext
{        
    partial void UpdateTag(Tag instance)
    {
        //If PostID is null
        if(!instance.PostID.HasValue)
        {
            //Delete this record from the DB
            this.ExecuteDynamicDelete(instance);
        }
    }
}

而不是.dbml文件中的最后一段代码some advise to set "DeleteOnNull"属性(设计器无法访问)