سؤال

لقد بنيت إطار الكيان نموذج ضد 2008 قاعدة البيانات الخاصة بنا.كل شيء يعمل على ما يرام ضد 2008 قاعدة البيانات الخاصة بنا.عند محاولة تحديث الكيان في عام 2005 قاعدة بيانات يمكنني الحصول على هذا الخطأ.

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

أنا على وجه التحديد لم تستخدم أي 2008 الميزات عندما بنيت قاعدة البيانات.لا أستطيع أن أجد أي إشارة إلى datetime2 في المدونة.و نعم العمود بأنها "التاريخ والوقت" في قاعدة البيانات.

هل كانت مفيدة؟

المحلول

وA جوجل سريعة يشير لي إلى ما يشبه في حل .

وفتح EDMX في محرر ملف (أو "فتح مع ..." في Visual Studio ومحرر XML حدد). في الجزء العلوي سوف تجد نموذج التخزين ولها سمة ProviderManifestToken. يجب أن يكون قيمة 2008. تغيير هذا إلى عام 2005، إعادة ترجمة ويعمل كل شيء هذا الأمر.

ملحوظة: سيكون لديك للقيام بذلك في كل مرة قمت بتحديث نموذج من قاعدة

نصائح أخرى

وعرض سريع من السطر:

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

وهذا امر محبط للغاية، وأنا مندهش قررت MS لا تجعل من ذلك هل يمكن أن تستهدف إصدار SQL معينة. للتأكد من أننا نستهدف 2005 كتبت التطبيق وحدة تحكم بسيطة والذي يطلق عليه في خطوة PreBuild.

والخطوة 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);
            }
        }
    }
}

باستخدام @فانس مفيد وحدة التحكم التطبيق أعلاه ، اعتدت التالية كما 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 إلى المكتبة مجلد حل و هذا يساعد, كما يمكن الآن تحقق من ملفات آدم قبل محاولة تحريرها ، كجزء من بناء.كما يجب إضافة هذه الشروط ، بحيث مجموعات 2005 نشر إلى خادم والعودة إلى 2008 ديف آلة sln تكوينات.كما ذكر تحتاج إلى إضافة الفعلية SetEdmxSqlVersion.exe (و .pdb) file(s) إلى مجلد مكتبة (أو في أي مكان آخر كنت تريد أن تبقي هذه البتات).

شكرا جزيلا @فانس. حقا أنيق ضخمة الوقت المدخر و تحافظ على بلدي يبني الآلي تماما و خالية من الألم :)

لصالح الناس الذين يواجهون نفس المشكلة ولكن تستخدم على رمز الأولى ، أو تحقق من جوابي هنا حول كيفية تغيير ProviderManifestToken كود الأولى. أنها تنطوي على خلق DbModelBuilder يدويا وتمرير مثيل DbProviderInfo (مع رمز المناسب) عند استدعاء الأسلوب Build باني النموذج.

وكان يعاني من مشكلة مماثلة مع 2012 مقابل 2008. ويمكن حلها مع حدث BeforeBuild باستخدام 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 الصحيح بالطبع أيا كان هذا هو لك.

وكان لدينا هذا الخطأ على V.3 SQL2005، حيث لم يكن لدينا على V.4 SQL2005.

وإضافة SQL2005 إلى سلسلة الاتصال الثابتة مشكلة معينة لدينا.

ونحن لم تتعرف لماذا حتى الآن، ولم ترغب في تعديل التعليمات البرمجية لتوفير رمز كما تحل فوق (قضية تجلى أثناء النشر).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top