Menggunakan SQL Server 2008 dan SQL Server 2005 dan tanggal waktu

118

Saya telah membangun model kerangka entitas terhadap database 2008. Semua bekerja dengan baik terhadap database 2008. Ketika saya mencoba untuk memperbarui entitas pada database 2005 saya mendapatkan kesalahan ini.

Versi SQL Server yang digunakan tidak mendukung datatype 'datetime2

Saya secara khusus tidak menggunakan fitur 2008 apa pun saat membuat database. Saya tidak dapat menemukan referensi apa pun ke datetime2 dalam kode. Dan, ya, kolom tersebut didefinisikan sebagai "datetime" dalam database.

Monroecheeseman
sumber

Jawaban:

189

Google cepat mengarahkan saya ke apa yang tampak seperti solusinya .

Buka EDMX Anda di editor file (atau "buka dengan ..." di Visual Studio dan pilih XML Editor). Di bagian atas, Anda akan menemukan model penyimpanan dan memiliki atribut ProviderManifestToken. Ini harus memiliki nilai 2008. Ubah itu menjadi 2005, kompilasi ulang dan semuanya berfungsi.

CATATAN: Anda harus melakukan ini setiap kali Anda memperbarui model dari database.

Richard Harrison
sumber
2
Saya memilih ini karena kesalahan, membatalkan itu, tetapi sekarang tidak dapat melakukan apa yang benar-benar ingin saya lakukan yaitu memilihnya! Terima kasih telah menemukan masalahnya. Jika saya mengerti dengan benar, apakah nilai berubah dari 2005 ke 2008 karena memperbarui model dari database, di mana database adalah SQL 2008 DB? Di lingkungan saya, mesin pengembang saya memiliki SQL 2008, tetapi lingkungan pengujian memiliki 2005 (yang juga diproduksi oleh produksi). Sampai kita bermigrasi ke 2008, apakah saya benar berasumsi bahwa ini akan terus terjadi?
jamiebarrow
Saya biasanya menetapkan ini ke 2005, yang merupakan database produksi; Saya menggunakan 2008 untuk pengembangan. 2008 kompatibel ke belakang jadi tidak ada masalah. Juga ini akan diubah kembali setelah update / generate. Saya selalu memvalidasi ini ketika memeriksa EDMX setelah pengalaman pahit.
Richard Harrison
perbaikan ini tidak berhasil untuk saya ?? forums.asp.net/p/1770522/4838628.aspx/…
Welsh King
Jika ini terjadi di LightSwitch, lihat posting blog saya yang menjelaskan cara memperbaikinya di file lsml (karena tidak ada akses langsung ke file edmx di LS): lightswitchcentral.net.au/Blog/tabid/83/EntryId/27/ …
Yann Duran
Ini satu-satunya solusi tetapi Anda harus sadar bahwa Anda perlu melakukan ini setiap kali Anda mengubah edmx karena akan mengembalikan dirinya sendiri
Dave Hogan
11

Tampilan cepat dari garis:

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

Ini sangat membuat frustrasi dan saya terkejut MS memutuskan untuk tidak membuatnya sehingga Anda dapat menargetkan versi SQL tertentu. Untuk memastikan kami menargetkan 2005, saya menulis aplikasi konsol sederhana dan menyebutnya dalam langkah PreBuild.

Langkah prebuild terlihat seperti ini:

$(SolutionDir)Artifacts\SetEdmxVer\SetEdmxSqlVersion $(ProjectDir)MyModel.edmx 2005

Kode di sini:

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 Kessler
sumber
@Vance terima kasih banyak, sempurna. Sedikit lambat, karena saya memiliki tiga file edmx yang perlu saya ubah, jadi mungkin menambahkan konfigurasi solusi hanya untuk mengembalikan setelah penerapan, dan menghapusnya dari build biasa. Akan memposting jawaban sekarang dengan info untuk menggunakan alat praktis ini di BeforeBuild (atau AfterBuild) daripada pra-build. Sangat dihargai.
MemeDeveloper
3

Menggunakan aplikasi konsol praktis @ Vance di atas, saya menggunakan yang berikut ini sebagai acara 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>

Ini sangat berguna, karena menghindari penerapan ulang yang mengganggu. Terima kasih telah membagikan Vance.

Saya telah menambahkan TF.exe ke folder solusi Perpustakaan dan ini membantu, karena sekarang saya dapat memeriksa file edmx sebelum mencoba mengeditnya, sebagai bagian dari build. Juga saya telah menambahkan ini dengan kondisi, sehingga set ke 2005 untuk penyebaran ke server dan kembali ke 2008 untuk konfigurasi sln mesin Dev. Juga untuk menyebutkan Anda perlu menambahkan file SetEdmxSqlVersion.exe (dan .pdb) sebenarnya ke folder Library (atau di mana pun Anda ingin menyimpan bit ini).

Terima kasih banyak @Vance. Benar-benar rapi, penghemat waktu masif dan membuat bangunan saya benar-benar otomatis dan bebas rasa sakit :)

MemeDeveloper
sumber
2

Memiliki masalah serupa dengan 2012 vs. 2008. Ini dapat diselesaikan dengan acara BeforeBuild menggunakan XmlPeek dan 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>

Jika Anda tidak menyukai penggantian otomatis, Anda cukup mengganti tugas XmlPoke dengan tugas Error.

Edgar
sumber
Ini jauh lebih baik daripada menggunakan executable eksternal, memungkinkan MSBuild untuk menangani semua kemewahan secara internal. Ini semua dapat dengan mudah dirantai melalui CallTargettugas target pra-build bersyarat, bergantung pada konfigurasi publikasi / build. (EG hanya berubah saat menerapkan ke lingkungan
sql2005
1

Untuk kepentingan orang-orang yang mengalami masalah yang sama tetapi menggunakan Kode Pertama , lihat jawaban saya di sini tentang cara mengubah ProviderManifestTokendi Kode Pertama. Ini melibatkan pembuatan DbModelBuildersecara manual dan meneruskan sebuah DbProviderInfoinstance (dengan token yang sesuai) saat memanggil metode pembuat model Build.

sinelaw.dll
sumber
Saya pikir set Type System Version=SQL Server 2005dalam string koneksi juga dapat berfungsi
code4j
0

Solusi yang lebih baik bagi saya adalah daripada mengedit file EDMX secara manual, cukup buka edmx dalam mode desain dan dalam menu konteks "Perbarui Model dari Database ...". Anda harus menunjuk ke versi SQL yang benar tentu saja apa pun ini untuk Anda.

Marek
sumber
1
Saya pikir ini adalah masalah OP - dia mengembangkannya terhadap SQL lokal 2008 tetapi kemudian digunakan untuk SQL 2005.
StuartLC
Ini berfungsi kecuali Anda tidak memiliki akses ke contoh SQL 2005.
Darcy
1
Kerugian besar adalah bahwa ini merupakan langkah manual, dan karenanya akan dilupakan.
Jowen
0

Kami mengalami kesalahan ini di SQL2005 v.3, di mana kami tidak memilikinya di SQL2005 v.4.

Menambahkan SQL2005 ke string koneksi memperbaiki masalah khusus kami.

Kami belum mengidentifikasi alasannya, dan tidak ingin mengubah kode untuk memberikan token seperti yang diselesaikan di atas (masalah terwujud selama penerapan).

Brian H.
sumber