118

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

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

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

4

8 に答える 8

189

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

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

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

于 2008-11-25T06:31:11.277 に答える
11

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

<Schema Namespace="Foobar.Store" Alias="Self" Provider="System.Data.SqlClient" ProviderManifestToken="2005" >
于 2010-02-05T23:46:29.000 に答える
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に感謝します。本当にきちんとした、大幅な時間の節約になり、ビルドを完全に自動化して痛みをなくします:)

于 2012-03-28T20:07:24.213 に答える
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 タスクを Error タスクに置き換えることができます。

于 2016-03-08T12:10:51.443 に答える
1

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

于 2012-08-21T18:22:27.287 に答える
0

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

于 2011-03-30T11:29:53.483 に答える