문제

2008 데이터베이스에 대한 엔티티 프레임 워크 모델을 구축했습니다. 2008 년 데이터베이스에 대해 모두 작동합니다. 2005 년 데이터베이스에서 엔티티를 업데이트하려고하면이 오류가 발생합니다.

The version of SQL Server in use does not support datatype 'datetime2

데이터베이스를 구축 할 때 특히 2008 기능을 사용하지 않았습니다. 코드에서 DateTime2에 대한 참조를 찾을 수 없습니다. 예, 열은 데이터베이스에서 "DateTime"으로 정의됩니다.

도움이 되었습니까?

해결책

빠른 Google은 해결책.

파일 편집기에서 EDMX를 엽니 다 (또는 Visual Studio에서 "Open with…"및 XML 편집기 선택). 맨 위에는 스토리지 모델을 찾을 수 있으며 속성 제공 업체 ManifestToken이 있습니다. 이것은 2008 년 가치를 가져야합니다. 2005 년으로 변경하고 다시 컴파일하고 모든 것이 작동합니다.

참고 : 데이터베이스에서 모델을 업데이트 할 때마다이를 수행해야합니다.

다른 팁

라인의 빠른보기 :

<Schema Namespace="Foobar.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >

이것은 매우 실망스럽고 MS가 주어진 SQL 버전을 타겟팅 할 수 있도록 만들지 않기로 결정한 것에 놀랐습니다. 우리가 2005 년을 타겟팅하고 있는지 확인하기 위해 간단한 콘솔 앱을 작성하여 사전 빌드 단계에서 호출합니다.

사전 건축 단계는 다음과 같습니다.

$(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 <edmxFile> <sqlVer>");
                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);
            }
        }
    }
}

위의 @Vance의 Handy Console 앱을 사용하여 다음을 이전 빌드 이벤트로 사용했습니다.

<Target Name="BeforeBuild">
    <!--Check out BD.edmx, Another.edmx, all configs-->
    <Exec Command="$(SolutionDir)\Library\tf checkout /lock:none $(ProjectDir)Generation\DB.edmx" />
    <Exec Command="$(SolutionDir)\Library\tf checkout /lock:none $(ProjectDir)Generation\Another.edmx" />
    <!--Set to 2008 for Dev-->
    <Exec Condition=" '$(Configuration)' == 'DEV1' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV1' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV2' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2008" />
    <Exec Condition=" '$(Configuration)' == 'DEV2' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2008" />
    <!--Set to 2005 for Deployments-->
    <Exec Condition=" '$(Configuration)' == 'TEST' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'TEST' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'PRODUCTION' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\DB.edmx 2005" />
    <Exec Condition=" '$(Configuration)' == 'PRODUCTION' " Command="$(SolutionDir)Library\SetEdmxSqlVersion $(ProjectDir)Generation\Another.edmx 2005" />
  </Target>

성가신 재배치를 피하기 때문에 이것은 매우 편리합니다. Vance를 공유해 주셔서 감사합니다.

라이브러리 솔루션 폴더에 tf.exe를 추가했는데 이제 빌드의 일부로 편집하기 전에 EDMX 파일을 확인할 수 있으므로 도움이됩니다. 또한 조건과 함께 추가하여 2005 년으로 서버 배포를 위해, Dev Machine SLN 구성을 위해 2008 년으로 거슬러 올라갑니다. 또한 실제 setedmxsqlversion.exe (및 .pdb) 파일을 라이브러리 폴더 (또는이 비트를 유지하려는 곳)에 추가해야합니다.

정말 감사합니다 @vance. 정말 깔끔하고 거대한 시간 보호기와 내 빌드를 완전히 자동화하고 통증을 유지합니다. :)

같은 문제를 겪고 있지만 사용하는 사람들의 이익을 위해 먼저 코드, 체크 아웃 내 대답 변경 방법에 대해 ProviderManifestToken 코드에서 먼저. a DbModelBuilder 수동으로 그리고 전달 a DbProviderInfo 모델 빌더를 호출 할 때 인스턴스 (적절한 토큰 포함) Build 방법.

2012 년 대 2008과 비슷한 문제가있었습니다. XMLPEEK 및 XMLPOKE를 사용하여 이전 건축 이벤트로 해결할 수 있습니다.

   <Target Name="BeforeBuild">
      <XmlPeek XmlInputPath="$(ProjectDir)MyModel.edmx"
               Namespaces="&lt;Namespace Prefix='edmx' Uri='http://schemas.microsoft.com/ado/2009/11/edmx'/&gt;&lt;Namespace Prefix='ssdl' Uri='http://schemas.microsoft.com/ado/2009/11/edm/ssdl'/&gt;"
               Query="/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/@ProviderManifestToken">
         <Output TaskParameter="Result" ItemName="TargetedSQLVersion" />
      </XmlPeek>

      <XmlPoke Condition="@(TargetedSQLVersion) != 2008"
               XmlInputPath="$(ProjectDir)MyModel.edmx"
               Namespaces="&lt;Namespace Prefix='edmx' Uri='http://schemas.microsoft.com/ado/2009/11/edmx'/&gt;&lt;Namespace Prefix='ssdl' Uri='http://schemas.microsoft.com/ado/2009/11/edm/ssdl'/&gt;"
               Query="/edmx:Edmx/edmx:Runtime/edmx:StorageModels/ssdl:Schema/@ProviderManifestToken"
               Value="2008">
      </XmlPoke>
   </Target>

자동 교체를 싫어하는 경우 XMLPoke 작업을 오류 작업으로 간단히 바꿀 수 있습니다.

나에게 더 나은 솔루션은 EDMX 파일을 수동으로 편집하는 대신 디자인 모드와 문맥 메뉴 "데이터베이스의 업데이트 모델 ..."에서 EDMX를 열 수있는 것입니다. 당신은 이것이 당신을위한 것이 무엇이든간에 올바른 SQL 버전을 가리키고 있어야합니다.

SQL2005 V.3 에서이 오류가 발생했으며 SQL2005 v.4에 없었습니다.

연결 문자열에 SQL2005를 추가하면 특정 문제가 수정되었습니다.

우리는 아직 이유를 확인하지 않았으며 위에 해결 된대로 토큰을 제공하기 위해 코드를 수정하고 싶지 않았습니다 (배포 중에 나타난 문제).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top