使用entity framework模型将不同项目中的POCO类生成到项目中
我试图使用VS2010的EF4使用存储库模式。
为此,我通过右键单击实体模型devise器并单击添加代码生成项来使用POCO代码生成。 然后我selectPOCO模板并获得我的课程。
我希望能够做的是将我的解决scheme组织成实体(POCO)类的单独项目,以及实体模型和存储库代码的另一个项目。
这意味着我的MVC项目可以使用POCO类来实现强types的视图等,而不必知道仓库或者必须引用它。
为了将它们连接在一起,我将有另一个单独的接口项目,并使用IoC。
听起来不错,我只是不知道如何生成自己的项目类! 我可以复制它们,然后更改它们上的命名空间,但是我想避免手动工作,每当我更改数据库中的模式,并想更新我的模型。
谢谢
实际上,EF 4.0中的T4模板是在devise这个场景的时候考虑的:)
有2个模板:
- 一个为实体本身(即ModelName.tt)
- 一个用于ObjectContext(即ModelName.Context.tt)
您应该将ModelName.tt文件放在POCO项目中,只需将模板更改为指向持久感知项目中的EDMX文件即可。
听起来很奇怪,我知道:现在有一个依赖,但它是在T4世代,而不是在编译时! 那应该没问题? 因为由此产生的POCO大会仍然是完全无知的。
请参阅此步骤的第5步和第6步: http : //blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx了解更多信息。
希望这可以帮助
亚历克斯
@缺口,
- 要强制重新生成POCO实体,只需右键单击主.tt文件并select“运行自定义工具”。 这将强制它重新生成POCO类,并对.edmx模型进行更新。
- 是否有任何问题继续前进?右键单击模型并select“从模型生成数据库…”即使您不一定要生成数据库? 这将最有可能摆脱你的'错误11007 …'。
- 我认为这相当于一个“代码隐藏”。 我不知道更多。
还有一件事要注意Alex给出的链接。 一旦我将我的主.tt文件移动到不同的项目中,从“.Context.tt”文件生成的文件将不会编译,因为它缺less对位于不同名称空间中的POCO文件的引用(因为我想我的ObjectContext与我的POCO文件不在同一个域中)。 我必须修改“.Context.tt”文件以using Poco.Namespace
(其中Poco.Namespace
是生成POCO文件的名称空间的名称)。 这允许我的项目进行编译。
乔尔
对于EF5 + DbContext生成器:将Name.Context.tt移动到不同的项目很容易。 但是,您将需要引用模型类。 您可以手动执行此操作,但这将需要您每次生成代码时都要更改它。 您也可以为两个项目使用相同的命名空间。 这是有效的,将工作,但我认为这是糟糕的devise。 另一种方法是更改T4模板(Name.Context.tt)。
改变这一点(第43行):
using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; <# if (container.FunctionImports.Any()) { #>
对此:
using System; using System.Data.Entity; using System.Data.Entity.Infrastructure; <# if (modelNamespace != codeNamespace) #> using <#=code.EscapeNamespace(modelNamespace)#>; <# if (container.FunctionImports.Any()) { #>
这将检查你的模型命名空间是否与你的代码命名空间不同,如果是的话,它会插入所需的使用来引用你的模型类。
使用这种方法结合dynamic数据项目和控件时遇到了一个严重的错误。 基本上,你会得到一个错误。
“无法确定MetaTable,无法确定数据源”EntityDataSource1“的MetaTable,并且无法从请求URL中推断出一个MetaTable,确保该表映射到数据源或configuration了数据源使用有效的上下文types和表名,或者请求是注册的DynamicDataRoute的一部分。