EF学习杂记26:如何通过使用Sbub Entity避免不必要的数据库检索

什么叫 Stub Entities?

一个stub entity是一个代表真实实体的,但是只包含部分实体属性的特殊实体

举个例子:

Category c = new Category { ID = 5 };

这里的Category就是一个只包含了ID属性的不完整对象,只是表明了这是Category 5,这样的实体对象,我们称之为Sub Entity。

Stub Entities 有什么作用?

Stub Entities 在你不需要完全知道实体对象所有属性的时候将非常有用,它可以使你避免一些不必要的数据库查询,同时这种使用方式也比使用EntityKey的方式要简单的多。

下面是一些例子:

例子 1 - 用Stub Entity来建立一个relationship:

这是一种比较常见的使用Stub Entity的方式,假设你要在一个新的Product对象和一个已有的Category对象之间建立一种关联,如果你知道那个已有的Category的ID=5,常规的情况下,你可能像下面这样做:

Product p = new Product {

     Name = “°Bovril”±,

     Category = ctx.Categories.First(c => c.ID == 5)

如果你仅仅是为了建立Product和Category对象之间的关系,那么这里对Category的这次查询其实是么有必要的,因为你并不需要整个

Category实体,你已经知道了你所需要的ID值,所以你可以优化上面的代码如下:

//如果你不希望在下面的AttachTo中使用字符这样的非强类型方式,请查看前面的相关杂记

ctx.AttachTo(“°Categories”±,category);

Product product = new Product {

     Name = “°Bovril”±,

     Category = category

};

ctx.AddToProducts(product);

ctx.SaveChanges();

上面的代码节省了一次数据库查询。

注: 你同样可以通过上面的方法在数组之间建立新的连接。

例子 2 – 在删除中使用 Stub Entity:

常规的删除语句如下:

Category category = ctx.Categories.First(c => c.ID == 5);

ctx.DeleteObject(category);

ctx.SaveChanges();

在执行删除之前,其实第一行已经进行了一次数据库查询,如果要删除的这个实体没有与其他实体有连接关系的话,这次查询时可以避免的。

Category category = new Category { ID = 5 };

ctx.AttachTo(“°Categories”±,category);

ctx.DeleteObject(category);

ctx.SaveChanges();

又一次通过利用Stub Entity节省了一次数据库查询,但这里要注意,Category不能与其他对象实体有关联。

例子 3 – 利用Stub Entity删除有外键关联的实体对象

上面的例子强调了不能直接利用Stub Entity删除有外键关联的对象实体,但是如果很不幸,你要删除的对象恰好就是有外键关联的实体,比如Product,它与Category具有外键关联,Entity Framework在执行删除操作的时候,需要知道该对象所有的外键关联对象。那能不能利用Stub Entity来进行删除操作呢?我们先弄清楚,在常规情况下,如果你要删除有外键关联的实体,Entity Framework会自动的通过一种叫做relationship span的机制获取其需要的其他对象的信息,如果我们想利用Stub Entity来节省一次数据库查询,我们就需要利用另一个Stub Entity来告诉Entity Framework有关的外键关联。

Product product = new Product {

     ID = 5, 

     Category = new Category { ID = 5 }

};

ctx.AttachTo(“°Products”±,product);

ctx.DeleteObject(product);

ctx.SaveChanges();

可以看到,这里利用了两个Stub Entity,从而节省了一次数据库查询。

And here by using two stub entities, we’ve again saved a query

注: 在.NET 4.0中,由于使用了 FK associations,我们将不再需要上面的代码,Entity Framewlrk将可以直接删除Product,即使它存在外部关联,就是因为有FK associations的存在,所以要修正一下例子2注释中的说法。

例子 4 – 删除一个带有时间戳类型属性的实体

当你要删除的实体本身含有一些并发标识属性(通常是timtstamp类型)的时候,你需要向Entity Framework提供这些属性:

Order order = new Order{

      OrderNo = 3425,

      Timestamp = timestamp,

      Customer = new Customer { ID = 7}

};

ctx.AttachTo(“°Orders”±, order);

ctx.DeleteObject(order);

同样使用了Stub Entity节省了一次数据库查询。

例子 5 – 更新实体

如果你需要更新一个实体,你只需要Attach一个包含这个这个实体要更新的属性的原始版本的对象到Context,同样可以利用Stub方式进行更新:

Person person = new Person{

      ID = 65,

      Firstname = “°Jo”±,

      Surname = “°Andrews”±

};

ctx.AttachTo(“°People”±, person);

person.Surname = “°James”±; // Yes my wife took my surname!

ctx.SaveChanges();
总结

通过上面的五个例子,我们可以看出在节省数据查询方面,Stub Entities非常的游泳,它的引入不仅节省了数据库查询,还使你的程序更加的高效和简洁,它同时使你的代码相对于使用EntityKey的方式,更具有可读性。

使用Stub Entities的常规步骤其实非常简单:

  1. 利用一些你需要的属性创建一个Stub Entity。
  2. 通过Attach的方式绑定到Context上。
  3. 使用它(创建关联,删除,更新等等)

你可能感兴趣的:(entity)