通过更新父对象来删除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();
并完成它。在我的项目上下文中,这样的代码将放在从通用服务继承的自定义服务中。关键是,我只是想知道是否可以在更新父对象时删除相关对象。如果可能的话,这可能会帮助我更快地生成一些原型代码,如果不能,我就按照标准方式处理它。
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"属性(从设计器无法访问)