.net 使用实体框架模型在不同项目中生成POCO类
我正在尝试使用VS2010将存储库模式与EF4结合使用 为此,我通过右键单击实体模型设计器并单击添加代码生成项来使用POCO代码生成。然后我选择POCO模板并获取我的类 我希望能够将我的解决方案结构化为实体(POCO)类的单独项目和实体模型和存储库代码的另一个项目 这意味着我的MVC项目可以将POCO类用于强类型视图等,而无需了解存储库或对其进行引用 为了把它们连接在一起,我将有另一个带有接口的独立项目,并使用IoC 听起来不错,我只是不知道如何将类生成到自己的项目中!我可以复制它们,然后更改它们上的名称空间,但是每当我更改数据库中的模式并想要更新模型时,我希望避免手动操作.net 使用实体框架模型在不同项目中生成POCO类,.net,entity-framework,code-generation,repository-pattern,poco,.net,Entity Framework,Code Generation,Repository Pattern,Poco,我正在尝试使用VS2010将存储库模式与EF4结合使用 为此,我通过右键单击实体模型设计器并单击添加代码生成项来使用POCO代码生成。然后我选择POCO模板并获取我的类 我希望能够将我的解决方案结构化为实体(POCO)类的单独项目和实体模型和存储库代码的另一个项目 这意味着我的MVC项目可以将POCO类用于强类型视图等,而无需了解存储库或对其进行引用 为了把它们连接在一起,我将有另一个带有接口的独立项目,并使用IoC 听起来不错,我只是不知道如何将类生成到自己的项目中!我可以复制它们,然后更改它
感谢事实上,EF 4.0中的T4模板是在设计时考虑到了以下场景:) 有两个模板:
- 一个用于实体本身(即ModelName.tt)
- 一个用于ObjectContext(即ModelName.Context.tt)
(其中Poco.Namespace
是生成Poco文件的命名空间的名称)。这样就可以编译我的项目了
JoelFor EF5+DbContext generator:很容易将您的Name.Context.tt移动到其他项目。但是,您需要引用模型类。您可以手动执行此操作,但这将要求您在每次生成代码时对其进行更改。您还可以为两个项目使用相同的命名空间。这是有效的,会起作用,但我认为这是一个糟糕的设计。另一种选择是更改T4模板(Name.Context.tt)
更改此项(第43行):
使用系统;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
为此:
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (modelNamespace != codeNamespace)
#>
using <#=code.EscapeNamespace(modelNamespace)#>;
<#
if (container.FunctionImports.Any())
{
#>
使用系统;
使用System.Data.Entity;
使用System.Data.Entity.Infrastructure;
使用;
这将检查您的模型名称空间是否与代码名称空间不同,如果不同,它将插入引用模型类所需的using。re:2。编译时,我现在收到每个实体的警告:“错误11007:实体类型XXXX未映射。”。这可能与没有生成数据库(?)有关,但在我编辑edmx(使用xml编辑器)以删除其中的映射(尽管它看起来很完美)之前,这并没有发生。然后,我回到设计器并使用该工具添加映射。我对“.Context.tt”有着完全相同的问题文件,并希望使用有效的
语句添加一个。问题是文件是自动生成的。如果必须更新模型,则必须删除并重新添加using
语句。有没有更好的方法来解决这个问题?没关系,只要看看Alex的链接就知道了。滚动到名为7的部分。更改“Blogging.Context.tt”名称空间以匹配“Entities”Context.tt属性上的自定义工具名称空间可以更新为MyProject.Modelfound@AmrElgarhy互联网档案拯救!先生,你真是个传奇人物D“…但这将要求您在每次生成代码时对其进行更改…”-如果您的意思是当由EDMX或其他程序重新生成TT文件时,那么我通常会提前在源代码管理中使用TT,并简单地恢复更改
using System;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
<#
if (modelNamespace != codeNamespace)
#>
using <#=code.EscapeNamespace(modelNamespace)#>;
<#
if (container.FunctionImports.Any())
{
#>