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

本文关键字:对象 SQL to 删除 更新 Linq | 更新日期: 2023-09-27 18:11:30

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

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

的例子:

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

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

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

我记得以前尝试过这个想法,但从来没有成功过(我认为异常提到了一个事实,即对象被附加到DB作为失败的原因)。

我知道我可以简单地写:

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

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

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

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();

或This way also work

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

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

假设在Post和Tag之间有一个空外键,并且关联是由Tag建立的。postd == 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();

在此之后(如果您的外键是可空的),您将有一个标记在您的数据库与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文件中设置"DeleteOnNull"属性(从设计器无法访问)