我已经针对2008数据库构建了一个实体框架模型.一切都适用于2008数据库.当我尝试更新2005数据库上的实体时,我收到此错误.
The version of SQL Server in use does not support datatype 'datetime2
我在构建数据库时没有使用任何2008功能.我在代码中找不到对datetime2的任何引用.并且,是的,该列在数据库中被定义为"datetime".
快速谷歌指出我看起来像解决方案.
在文件编辑器中打开EDMX(或在Visual Studio中"以...打开"并选择XML编辑器).在顶部,您将找到存储模型,它具有属性ProviderManifestToken.这应该具有值2008.将其更改为2005,重新编译,一切正常.
注意:每次从数据库更新模型时都必须执行此操作.
快速查看线:
这是非常令人沮丧的,我很惊讶MS决定不这样做,所以你可以针对给定的SQL版本.为了确保我们的目标是2005年,我编写了一个简单的控制台应用程序并在PreBuild步骤中调用它.
预建步骤如下所示:
$(SolutionDir)Artifacts\SetEdmxVer\SetEdmxSqlVersion $(ProjectDir)MyModel.edmx 2005
代码在这里:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Xml; namespace SetEdmxSqlVersion { class Program { static void Main(string[] args) { if (2 != args.Length) { Console.WriteLine("usage: SetEdmxSqlVersion"); return; } string edmxFilename = args[0]; string ver = args[1]; XmlDocument xmlDoc = new XmlDocument(); xmlDoc.Load(edmxFilename); XmlNamespaceManager mgr = new XmlNamespaceManager(xmlDoc.NameTable); mgr.AddNamespace("edmx", "http://schemas.microsoft.com/ado/2008/10/edmx"); mgr.AddNamespace("ssdl", "http://schemas.microsoft.com/ado/2009/02/edm/ssdl"); XmlNode node = xmlDoc.DocumentElement.SelectSingleNode("/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema", mgr); if (node == null) { Console.WriteLine("Could not find Schema node"); } else { Console.WriteLine("Setting EDMX version to {0} in file {1}", ver, edmxFilename); node.Attributes["ProviderManifestToken"].Value = ver; xmlDoc.Save(edmxFilename); } } } }