我正在尝试使用VS2010与EF4一起使用存储库模式。
为此,我通过右键单击实体模型设计器并单击添加代码生成项来使用POCO代码生成。然后我选择POCO模板并获取我的课程。
我希望能够将我的解决方案结构化为Entity(POCO)类的单独项目以及实体模型和存储库代码的另一个项目。
这意味着我的MVC项目可以将POCO类用于强类型视图等,而不必了解存储库或必须引用它。
要将它们全部插入,我将有另一个带接口的独立项目并使用IoC。
听起来很好我只是不知道如何将类生成到自己的项目中!我可以复制它们,然后更改它们上的命名空间,但是每当我更改数据库中的模式并希望更新我的模型时,我都希望避免手动工作。
由于
答案 0 :(得分:38)
实际上,EF 4.0中的T4模板在设计时考虑了这种情况:)
有两个模板:
您应该将ModelName.tt文件放在POCO项目中,只需将模板更改为指向持久性感知项目中的EDMX文件即可。
听起来很奇怪我知道:现在有依赖,但它是在T4生成时,而不是在编译时!这应该没问题?因为得到的POCO组件仍然是完全持久的无知。
见步骤5&其中6个:http://blogs.msdn.com/adonet/pages/walkthrough-poco-template-for-the-entity-framework.aspx了解更多。
希望这有帮助
Alex
答案 1 :(得分:5)
@Nick,
另外还要注意Alex给出的链接。一旦我将主.tt文件移动到另一个项目,从“.Context.tt”文件生成的文件将无法编译,因为它缺少对位于不同命名空间中的POCO文件的引用(因为我想要我的ObjectContext与我的POCO文件位于不同的域中)。我不得不修改“.Context.tt”文件以获得using Poco.Namespace
(其中Poco.Namespace
是生成POCO文件的命名空间的名称)。然后这允许我的项目编译。
乔尔
答案 2 :(得分:4)
对于EF5 + DbContext生成器:将Name.Context.tt移动到另一个项目很容易。但是,您需要引用模型类。您可以手动执行此操作,但这需要您在每次生成代码时进行更改。您也可以为两个项目使用相同的命名空间。这是有效的,并且会起作用,但我认为这是糟糕的设计。另一种方法是更改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())
{
#>
这将检查您的模型名称空间是否与您的代码名称空间不同,如果是,它将插入所需的用于引用您的模型类。