一个stub entity是一个代表真实实体的,但是只包含部分实体属性的特殊实体
举个例子:
Category c = new Category { ID = 5 };
这里的Category就是一个只包含了ID属性的不完整对象,只是表明了这是Category 5,这样的实体对象,我们称之为Sub Entity。
Stub Entities 在你不需要完全知道实体对象所有属性的时候将非常有用,它可以使你避免一些不必要的数据库查询,同时这种使用方式也比使用EntityKey的方式要简单的多。
下面是一些例子:
这是一种比较常见的使用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();
上面的代码节省了一次数据库查询。
注: 你同样可以通过上面的方法在数组之间建立新的连接。
常规的删除语句如下:
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不能与其他对象实体有关联。
上面的例子强调了不能直接利用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注释中的说法。
当你要删除的实体本身含有一些并发标识属性(通常是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节省了一次数据库查询。
如果你需要更新一个实体,你只需要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的常规步骤其实非常简单: