SQL Server 2008 ve SQL Server 2005 ve tarih saatini kullanma


118

2008 veritabanına göre bir varlık çerçeve modeli oluşturdum. Her şey 2008 veritabanıyla uyumludur. Varlığı bir 2005 veritabanında güncellemeye çalıştığımda bu hatayı alıyorum.

Kullanılan SQL Server sürümü, veri türü 'datetime2'yi desteklemiyor

Veritabanını oluştururken özellikle herhangi bir 2008 özelliğini kullanmadım. Kodda datetime2 ile ilgili herhangi bir referans bulamıyorum. Ve evet, sütun veritabanında "tarih saat" olarak tanımlanmıştır.

Yanıtlar:


189

Hızlı bir google, çözümün neye benzediğini gösteriyor .

EDMX'inizi bir dosya düzenleyicide açın (veya Visual Studio'da "birlikte aç ..." ve XML Düzenleyici'yi seçin). En üstte depolama modelini bulacaksınız ve bir ProviderManifestToken özniteliğine sahiptir. Bunun 2008 değeri olması gerekir. Bunu 2005 olarak değiştirin, yeniden derleyin ve her şey çalışır.

NOT: Modeli veritabanından her güncellediğinizde bunu yapmanız gerekecektir.


2
Yanlışlıkla buna oy verdim, geri alamadım, ama şimdi gerçekten yapmak istediğim şeyi yapamıyorum, bu da oy vermek! Sorunu bulduğunuz için teşekkür ederiz. Doğru anlarsam, veritabanının bir SQL 2008 DB olduğu veritabanından modelin güncellenmesi nedeniyle değer 2005'ten 2008'e değişir mi? Benim ortamımda, geliştirici makinemde SQL 2008 var, ancak test ortamında 2005 var (üretimde de var). 2008'e geçene kadar bunun devam edeceğini varsaymakta haklı mıyım?
jamiebarrow

Bunu genellikle üretim veritabanı olan 2005'e ayarlıyorum; 2008'i geliştirme için kullanıyorum. 2008 geriye dönük olarak uyumlu olduğundan sorun yok. Ayrıca bu, bir güncelleme / oluşturmadan sonra geri değiştirilecektir. Acı bir deneyimden sonra EDMX'i kontrol ederken bunu her zaman doğrularım.
Richard Harrison

bu düzeltme benim için çalışmıyor mu? forums.asp.net/p/1770522/4838628.aspx/…
Welsh King

Bu LightSwitch'te gerçekleşirse, lsml dosyasında nasıl düzeltileceğini açıklayan blog gönderime bakın (LS'de edmx dosyasına doğrudan erişim olmadığından): lightswitchcentral.net.au/Blog/tabid/83/EntryId/27/ …
Yann Duran

Tek çözüm bu, ancak edmx'i her değiştirdiğinizde kendisini eski haline döneceği için bunu yapmanız gerektiğinin farkında olmalısınız
Dave Hogan

11

Hattın hızlı görünümü:

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

10

Bu çok sinir bozucu ve MS'in belirli bir SQL sürümünü hedefleyebilmeniz için bunu yapmamaya karar vermesine şaşırdım. 2005'i hedeflediğimizden emin olmak için basit bir konsol uygulaması yazdım ve bunu PreBuild adımında çağırdım.

Ön oluşturma aşaması şuna benzer:

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

Kod burada:

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 çok teşekkürler, mükemmel. Biraz yavaş, çünkü değiştirmem gereken üç edmx dosyası var, bu yüzden bir dağıtımdan sonra geri dönmek için bir çözüm yapılandırması ekleyebilir ve normal yapıdan kaldırabilirim. Şimdi bu kullanışlı aracı ön derleme yerine BeforeBuild (veya AfterBuild) içinde kullanma bilgisiyle birlikte bir yanıt gönderecek. Çok memnun oldum.
MemeDeveloper

3

@ Vance'in yukarıdaki kullanışlı konsol uygulamasını kullanarak, aşağıdakileri bir BeforeBuild etkinliği olarak kullandım

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

Bu, can sıkıcı yeniden konuşlandırmayı önlediği için son derece kullanışlıdır. Vance'i paylaştığınız için teşekkürler.

Kitaplık çözüm klasörüne TF.exe'yi ekledim ve bu, derlemenin bir parçası olarak edmx dosyalarını düzenlemeye çalışmadan önce kontrol edebildiğim için yardımcı oluyor. Ayrıca bunu koşullarla ekledim, böylece sunucuya dağıtımlar için 2005'e ve Dev makine sln yapılandırmaları için 2008'e geri dönecek. Ayrıca, gerçek SetEdmxSqlVersion.exe (ve .pdb) dosyalarını Kitaplık klasörüne (veya bu bitleri saklamak istediğiniz başka bir yere) eklemeniz gerektiğini belirtmek isterim.

Çok teşekkürler @ Vance. Gerçekten düzgün, muazzam bir zaman tasarrufu sağlar ve yapılarımı tamamen otomatik ve ağrısız tutar :)


2

2012 ile 2008 arasında benzer bir sorun vardı. XmlPeek ve XmlPoke kullanılarak bir BeforeBuild olayı ile çözülebilir:

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

Otomatik değiştirmeyi sevmezseniz, XmlPoke görevini bir Hata göreviyle değiştirebilirsiniz.


Bu, harici bir yürütülebilir dosya kullanmaktan çok daha iyidir, MSBuild'in tüm fantezi işlerini dahili olarak yapmasına izin verir. Bunların tümü CallTarget, yayınlama / oluşturma yapılandırmalarına bağlı olarak koşullu derleme öncesi hedef görevleri aracılığıyla kolayca zincirlenebilir . (EG yalnızca bir sql2005 ortamına konuşlandırılırken değişir)
2016

1

Aynı sorunla karşılaşan ancak Code First kullanan kişilerin yararı için, Code First'ün nasıl değiştirileceğiyle ilgili cevabıma buradan göz ProviderManifestTokenatın. Model oluşturucunun yöntemini çağırırken DbModelBuildermanuel olarak oluşturmayı ve bir DbProviderInfoörneği (uygun belirteçle) iletmeyi içerir Build.


Sanırım Type System Version=SQL Server 2005bağlantı dizesinde set de işe yarayabilir
code4j

0

Benim için daha iyi bir çözüm, EDMX dosyasını manuel olarak düzenlemek yerine sadece tasarım modunda ve bağlam menüsünde "Veritabanından Modeli Güncelle ..." Elbette sizin için bu her ne ise, doğru SQL sürümüne işaret etmelisiniz.


1
Bence bu OP'nin sorunu - yerel bir SQL 2008'e karşı geliştirdi ancak daha sonra SQL 2005'e dağıtıldı.
StuartLC

Bu, bir SQL 2005 örneğine erişiminiz olmadığı sürece çalışır.
Darcy

1
Büyük bir dezavantaj, bunun manuel bir adım olması ve bu nedenle unutulacak olmasıdır.
Jowen

0

Bu hatayı SQL2005 v.3'te aldık, burada SQL2005 v.4'te yoktu.

Bağlantı dizesine SQL2005'in eklenmesi özel sorunumuzu çözdü.

Nedenini henüz tanımlamadık ve yukarıda çözüldüğü gibi belirteci sağlamak için kodu değiştirmek istemedik (sorun dağıtım sırasında ortaya çıktı).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.