我正在尝试创建符合
http://blogs.msdn.com/b/adonet/archive/2009/12/17/walkthrough-test-driven-development-with-the-entity-framework-4-0.aspx的假上下文
正如我所看到的,有一个接口公开了返回IObjectSet< ...>的方法,但是T4模板生成了返回ObjectSet< ...>的方法.并且没有生成的界面,并且在该页面上作者为创建的上下文添加了界面,并且它为他提供了创建模拟等的方法.
我的主要目标是使用T4模板生成poco类并创建模拟/伪上下文来测试我的自定义存储库.有没有办法让它无需编写或更改T4模板?如果它返回ObjectSet而不是IObjectSets,我如何在上下文之上创建模拟(对于IObjectSet并不是微不足道的)…
Thx提前
解决方法
作者只是模拟存储库,而不是实体. EntityFramework生成ObjectQueries,但是他包装它们并且他的存储库返回IObjectQueries.他这样做是为了让他可以轻松地模拟数据,然后在保存期间他只是验证实体.
如果您只是想创建一个“模拟”存储库,您可以创建自己的T4模板并迭代edmx文件并生成代码.但没有理由必须生成POCOS?它们已经存在,为什么你需要重新创建它们?他将所有内容抽象为“通用”FakeObjectSet,所以真的没有那么多代码可以编写?
你想要产生这个:
public IObjectSet<Blog> Blogs { get { return _blogs ?? (_blogs = new FakeObjectSet<Blog>()); } set { _blogs = value as FakeObjectSet<Blog>; } } private FakeObjectSet<Blog> _blogs;
如果是这样,我猜你会花更多的时间用T4然后你就会写它.
示例T4没有类声明…您可以按照this blog完成整个t4
<# foreach (EntitySet set in container.BaseEntitySets.OfType<EntitySet>()) { #> public IObjectSet<<#=MultiSchemaEscape(set.ElementType,code)#>> { get{ return <#=code.FieldName(set)#> ?? ( <#=code.FieldName(set)#> = FakeObjectSet<<#=MultiSchemaEscape(set.ElementType,code)#>>("<#=set.Name#>")); } set{ <#=code.FieldName(set)#> = value as FakeObjectSet<<#=MultiSchemaEscape(set.ElementType,code)#>>("<#=set.Name#>"); } } private FakeObjectSet<<#=MultiSchemaEscape(set.ElementType,code)#>> <#=code.FieldName(set)#>; <# } #>
哪个会产生这个代码:
public IObjectSet<Blogs>{ get{ return _Blogs?? ( _Blogs = FakeObjectSet<Blog>("Blogs")); } set{ _Blogs= value as FakeObjectSet<Class>("Blogs"); } } private FakeObjectSet<Blog> _Blogs;
边注.
IObjectSet包含在System.Data中,因此添加对System.Data.Entity.dll的引用