【发布时间】: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