当我想添加新的相关对象时,我可以使用此方法:
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();
并完成它。在我的项目环境中,这些代码将被放置在继承自通用服务的自定义服务中。关键是,我只想知道在更新父对象时是否可以删除相关对象。如果可能的话,这可能会帮助我更快地生成一些原型代码,如果不是,我只是以标准方式处理它。
答案 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"属性(设计器无法访问)