ef学习杂记4:怎样直接删除一个对象而无需检索它

问题

最常见的删除Entity Framework中实体的方式是将你要删除的实体传入Context中并像如下这样删除:

// 按ID查找一个类别
// 小提示:在.NET4.0中可以使用.Single()方法¨
// 以在有多于1项匹配结果时抛出异常
var category = (from c in ctx.Categories  
where c.ID == 3  
select c).First();
// 删除此项
ctx.DeleteObject(category); 
// 保存更改
ctx.SaveChanges();

    然而这段代码会触发两条数据库命令而不是一条。我的意思是我实际需要完成的就是:

DELETE FROM [Categories] WHERE ID = 3

大多数情况下这还不太坏,但是如果性能与可扩展性对你很关键,则这种方式绝不理想。

解决方案

幸运的是Entity Framework提供了名为AttachTo(…)的方法,它使你可以在未改变的状态下将实体放入ObjectContext中。

你可以使用这个方法像下面这样"伪造"一个查询:

// 创建一个实体来表示你想要删除的实体
// 注意你不需要知道所有的属性,
// 在这个例子中仅有ID足矣 
Category stub = new Category { ID = 4 };
// 将这个category的stub对象attach到"Categories"集中
// 这将实体在未改变的状态下放入context中
// 这是与你做出查询时对象拥有的状态一样的状态
ctx.AttachTo("Categories", stub);
// 删除这个category对象
 ctx.DeleteObject(stub);
//将?删?除y提á交?到?数y据Y库a
ctx.SaveChanges();

现在你已经在无需首先进行查询的情况下由数据中删除一个对象。

转载于:https://www.cnblogs.com/brusehht/archive/2010/08/24/1807188.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值