1

伙计们正在开发一个 Asp.Net MVC 项目,该项目已经使用存储库模式从 MS SQL Server 数据库中获取数据。

我现在打算将实体框架用于我们项目的一些新的特定需求,而不会干扰旧的存储库逻辑。我使用了 EF Power 工具 Beta 3 并从 Visual Studio 对我的数据库表进行了逆向工程,但生成的类与我现有的一些存储库类冲突,这些存储库类与数据库中的相应表同名,导致项目无法编译。我看过这个教程

但这讲述了将“tbl”前缀附加到表名而不更改生成的类名。但是,我自己尝试更改模板中生成的类名(存在于 CodeTemplates\ReverseEngineerCodeFirst 下,但它们仍然会产生冲突。

我的问题是我应该怎么做才能达到我的预期结果(与项目中的现有类没有冲突),还是应该完全采用其他替代方案?感谢您的帮助。

4

2 回答 2

1

我不知道如何让工具执行您所要求的操作,但是如何更改生成文件中的命名空间,这样重复的名称就无关紧要了?

于 2013-03-15T17:19:21.110 回答
0

好的,考虑到@jlew 的建议,我找到了一种解决方法,是的,它点击了:

这里是:

首先,我通过从以下链接下载的自定义模板覆盖了在“CodeTemplates/ReverseEngineerCodeFirst”文件夹下生成的默认模板:

http://romiller.com/2012/05/09/customizing-reverse-engineer-code-first-in-the-ef-power-tools/

(注意:这样做是为了使用 Data Annotations 进行配置,而不是 Fluent API,以便使用 Data Annotations 完成列和表映射。有关详细信息,请参阅上面的链接)。

然后我做了以下事情:

  1. 在 Context.tt 文件中替换

    using <#= code.EscapeNamespace(efHost.MappingNamespace) #>;
    
    namespace <#= code.EscapeNamespace(efHost.Namespace) #>
    

<#
    var hostMapNamespace = code.EscapeNamespace(efHost.MappingNamespace);
    hostMapNamespace = hostMapNamespace.Replace(".Models", ".ModelsEF");

    var hostNamespace = code.EscapeNamespace(efHost.Namespace);
    hostNamespace = hostNamespace.Replace(".Models", ".ModelsEF");
#>
using <#= hostMapNamespace #>;

namespace <#= hostNamespace #>

2- 在 Entity.tt 文件中替换

    namespace <#= code.EscapeNamespace(efHost.Namespace) #>

<#
    var hostNamespace = code.EscapeNamespace(efHost.Namespace);
    hostNamespace = hostNamespace.Replace(".Models", ".ModelsEF");
#>
namespace <#= hostNamespace #>

3-在 Mapping.tt 文件中替换

    namespace <#= code.EscapeNamespace(efHost.Namespace) #>

<#
    var hostMapNamespace = code.EscapeNamespace(efHost.Namespace);
    hostMapNamespace = hostMapNamespace.Replace(".Models", ".ModelsEF");
#>
namespace <#= hostMapNamespace #>

简而言之,我对自定义模板中的命名空间生成进行了一些更改,以避免与任何现有的项目类发生任何冲突,尤其是在 Models 命名空间中。好消息是……它有效!

于 2013-03-15T22:16:19.700 回答