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

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

你可能感兴趣的:(学习)