SQL Server 2008およびSQL Server 2005と日時の使用


118

2008データベースに対してエンティティフレームワークモデルを構築しました。すべて2008年のデータベースに対して問題なく動作します。2005データベースのエンティティを更新しようとすると、このエラーが発生します。

使用中のSQL Serverのバージョンは、データ型 'datetime2をサポートしていません

データベースを構築したとき、2008の機能は特に使用しませんでした。コードにdatetime2への参照が見つかりません。そして、はい、列はデータベースで「日時」として定義されています。

回答:


189

簡単なグーグルは解決策のように見えるものを私に示します

ファイルエディターでEDMXを開きます(またはVisual Studioで[...で開く]をクリックし、[XMLエディター]を選択します)。上部にはストレージモデルがあり、ProviderManifestToken属性があります。この値は2008である必要があります。これを2005に変更して、再コンパイルすると、すべてが機能します。

注:データベースからモデルを更新するたびに、これを行う必要があります。


2
私は誤ってこれに反対票を投じましたが、それを取り消しましたが、私が本当にやりたかったこと、つまり反対票を投じることはできなくなりました!問題を見つけていただきありがとうございます。私が正しく理解している場合、データベースがSQL 2008 DBであるデータベースからモデルを更新したため、値は2005から2008に変更されますか?私の環境では、開発者のマシンにはSQL 2008が含まれていますが、テスト環境には2005(実稼働環境も含まれています)が含まれています。私たちが2008年に移行するまで、これが発生し続けると私は思いますか?
jamiebarrow 2011年

通常は、これを運用データベースである2005に設定します。開発には2008を使用しています。2008は下位互換性があるため、問題はありません。また、更新/生成後に変更されます。苦い経験の後、EDMXをチェックインするときは常にこれを検証します。
Richard Harrison

この修正は私にとってはうまくいきませんか?forums.asp.net/p/1770522/4838628.aspx/...
ウェールズ王に

これがLightSwitchで発生する場合は、lsmlファイルで修正する方法を説明しているブログ投稿を参照してください(LSのedmxファイルに直接アクセスできないため):lightswitchcentral.net.au/Blog/tabid/83/EntryId/27/ …
Yann Duran

それが唯一の解決策だが、あなたはそれ自体が戻りますよう、このたびあなたはEDMXを改正行う必要があることに注意してください
デイヴホーガン

11

ラインのクイックビュー:

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

10

これは非常にイライラするものであり、特定のSQLバージョンをターゲットにできるようにMSがそれを行わないことに決めたことに驚いています。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 <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、ありがとうございます。変更が必要なedmxファイルが3つあるため、少し遅いため、展開後に元に戻し、通常のビルドから削除するためにソリューション構成を追加する場合があります。事前ビルドではなく、BeforeBuild(またはAfterBuild)でこの便利なツールを使用するための情報を記載した回答を今すぐ投稿します。大変感謝しています。
MemeDeveloper 2012年

3

上記の@Vanceの便利なコンソールアプリを使用して、BeforeBuildイベントとして以下を使用しました

<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>

煩わしい再デプロイメントを回避できるため、これは非常に便利です。ヴァンスを共有していただきありがとうございます。

ライブラリソリューションフォルダーにTF.exeを追加しました。これにより、ビルドの一部としてedmxファイルを編集する前にチェックアウトできるようになります。また、これを条件付きで追加したので、サーバーへの展開では2005年に設定され、Devマシンのsln構成では2008年に設定されます。また、実際のSetEdmxSqlVersion.exe(および.pdb)ファイルをLibraryフォルダー(またはこれらのビットを保持したい場所)に追加する必要があることにも言及します。

@Vanceに感謝します。本当にきちんとした、大規模な時間の節約と私のビルドを完全に自動化し、痛みのない:)


2

2012と2008で同様の問題がありました。XmlPeekとXmlPokeを使用して、BeforeBuildイベントで解決できます。

   <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タスクをエラータスクに置き換えるだけです。


これは、外部実行可能ファイルを使用するよりもはるかに優れており、MSBuildがすべての豪華さを内部で処理できるようにします。これはすべてCallTarget、パブリッシュ/ビルド構成に応じて、条件付きのプリビルドターゲットタスクを介して簡単にチェーンできます。(EGはsql2005環境に展開するときにのみ変更されます)
2016年

1

同じ問題が発生したがCode Firstを使用している人のために、Code Firstでを変更する方法についての私の答えをここで確認しくださいProviderManifestToken。これには、モデルビルダーのメソッドを呼び出すときに、DbModelBuilder手動で作成し、DbProviderInfoインスタンス(適切なトークンを使用)を渡すことが含まれますBuild


Type System Version=SQL Server 2005接続文字列に設定しても機能すると思います
code4j

0

EDMXファイルを手動で編集する代わりに、デザインモードとコンテキストメニューの[データベースからモデルを更新...]でedmxを開くだけで、より良い解決策が得られます。もちろん、正しいSQLバージョンを指している必要があります。


1
私は、これはOPの問題だと思う-彼はローカルSQL 2008に対して開発が、その後SQL 2005に展開
StuartLC

これは、SQL 2005インスタンスにアクセスできない場合を除いて機能します。
Darcy

1
大きな欠点は、それが手動の手順であるため、忘れられることです。
Jowen、2014

0

SQL2005 v.3ではこのエラーが発生しましたが、SQL2005 v.4では発生しませんでした。

SQL2005を接続文字列に追加すると、特定の問題が修正されました。

理由はまだ特定されていません。また、上記の解決策(展開中に明らかになった問題)のトークンを提供するようにコードを変更したくありませんでした。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.