【问题标题】:EF5 with custom T4 templates in Visual Studio 2013EF5 与 Visual Studio 2013 中的自定义 T4 模板
【发布时间】:2015-01-06 16:24:54
【问题描述】:

我们有一个代码生成解决方案,它使用 Visual Studio 2012 中的实体框架 5.0 设计器进行模型优先代码生成。因为我们需要自定义代码生成,所以我们使用了自定义工作流活动(和 Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DbGen):

<Activity x:Class="MyWorkflow"
    xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:s="clr-namespace:System;assembly=mscorlib"
    xmlns:sde="clr-namespace:System.Data.Metadata.Edm;assembly=System.Data.Entity,Version=5.0.0.0"
    xmlns:ded="clr-namespace:Microsoft.Data.Entity.Design.DatabaseGeneration.Activities;assembly=Microsoft.Data.Entity.Design"
    xmlns:dbtk="clr-namespace:OurCustomActivities;assembly=OurAssembly">
    <x:Members>
        <x:Property Name="Csdl" Type="InArgument(sde:EdmItemCollection)" />
        <x:Property Name="ExistingSsdl" Type="InArgument(s:String)" />
        <x:Property Name="ExistingMsl" Type="InArgument(s:String)" />
        <x:Property Name="Ssdl" Type="OutArgument(s:String)" />
        <x:Property Name="Msl" Type="OutArgument(s:String)" />
        <x:Property Name="Ddl" Type="OutArgument(s:String)" />
    </x:Members>
    <Sequence>
        <dbtk:CsdlToSsdlTemplateActivity SsdlOutput="[Ssdl]" TemplatePath="C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\CSDLToSSDL.tt"/>
        <dbtk:CsdlToMslTemplateActivity MslOutput="[Msl]" TemplatePath="C:\Program Files (x86)\Microsoft Visual Studio 11.0\Common7\IDE\Extensions\Microsoft\Entity Framework Tools\DBGen\CSDLToMSL.tt"/>
        ...

这在 Visual Studio 2012 的 EF5 项目中运行良好。

但是,在 Visual Studio 2013 中,相同的过程不再起作用。我们调整了上面 XAML 中的模板路径(改为C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7...),并将实体模型的Code Generation Strategy 属性切换为Legacy ObjectContext

在VS2013中使用Generate database from model命令时,得到如下信息:

这意味着活动的Csdl 输入参数需要一个

System.Data.Metadata.Edm.EdmItemCollection

但从 EF 设计器那里收到其他内容。我检查了 Visual Studio 2013 的 TablePerTypeStrategy.xaml 文件,发现它似乎收到了一个

System.Data.Entity.Core.Metadata.Edm.EdmItemCollection

相反。 这个命名空间显然属于 EF6 而不是 EF5。

因此,尽管我们的项目仅引用 EF5,但 Visual Studio 2013 似乎天生就使用 Entity Framework 6.0。

有什么想法吗?

编辑 1: 我尝试了 Pawel 的建议,即将命名空间 xmlns:sde 替换为其 EF6 对应项。当我这样做时,Generate database from model 命令显示以下错误:

The type 'System.Data.Entity.Core.Metadata.Edm.EdmItemCollection' is defined
in an assembly that is not referenced. You must add a reference to assembly
'EntityFramework, Version=6.0.0.0 ...

当我在我的.edmx 项目中使用以下命令时:

install-package EntityFramework -version 6.0.0.0

Nuget 卸载 EntityFramework 包的版本 5。

所以我们不得不使用 EF6。

是否可以在 Visual Studio 2013 中使用 EF5 和自定义代码生成?

【问题讨论】:

    标签: entity-framework visual-studio entity-framework-5 entity-framework-6


    【解决方案1】:

    VS2013 中的设计器在内部使用 EF6。您的活动需要 EF5 EdmItemCollection,但传递的是 EF6 EdmItemCollection。请注意,类型名称和方法相同,但名称空间不同。它们也来自不同的组件,因此是完全不同的类型。 (EF5 是他们分叉的 EF6 的起点)。您可以在我的post 中找到有关 VS2013 设计器中引入的更改的更多详细信息。 要解决您的问题,您需要查看 codeplex 上的默认 TypePerTypeStrategy.xaml 活动。您会注意到 EF 的命名空间如下:

    xmlns:sde="clr-namespace:System.Data.Entity.Core.Metadata.Edm;assembly=EntityFramework"
    

    我相信这是您需要在活动中使用的内容。 (同时检查其他命名空间和定义 - 我认为它们没有改变,但我已经有一段时间没有看到这个了)。

    【讨论】:

    • @cheeesus - 我不确定新错误来自哪里,所以很难判断发生了什么。 VS 有自己的 EF6.dll 副本,它应该在内部用于 99% 的任务,因此您不必将 EF6 安装到您的项目中。一般来说,VS2013 中的设计器应该能够同时处理 EF5 和 EF6 应用程序。我建议在entityframework.codeplex.com/workitem/list/basic 提交一个错误。确保提供复制品,否则可能很难解决。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-16
    • 1970-01-01
    • 1970-01-01
    • 2015-12-23
    相关资源
    最近更新 更多