SQL Server 2008 और SQL सर्वर 2005 और दिनांक समय का उपयोग करना


118

मैंने 2008 डेटाबेस के विरुद्ध एक इकाई ढांचा मॉडल बनाया है। सभी 2008 डेटाबेस के खिलाफ ठीक काम करता है। जब मैं 2005 डेटाबेस पर इकाई को अद्यतन करने का प्रयास करता हूं तो मुझे यह त्रुटि मिलती है।

उपयोग में SQL सर्वर का संस्करण डेटाटाइप 'datetime2 का समर्थन नहीं करता है

जब मैंने डेटाबेस बनाया तो मैंने विशेष रूप से किसी भी 2008 सुविधाओं का उपयोग नहीं किया। मुझे कोड में datetime2 का कोई संदर्भ नहीं मिल रहा है। और, हाँ स्तंभ को डेटाबेस में "डेटाइम" के रूप में परिभाषित किया गया है।

जवाबों:


189

एक त्वरित Google मुझे बताता है कि समाधान क्या दिखता है ।

एक फ़ाइल संपादक में अपना EDMX खोलें (या विजुअल स्टूडियो में "साथ खोलें ..." और XML संपादक चुनें)। सबसे ऊपर आपको स्टोरेज मॉडल मिलेगा और इसकी एक विशेषता है प्रदाताManifestToken। इसमें 2008 का मान होना चाहिए। इसे 2005 में बदलें, recompile और सब कुछ काम करता है।

नोट: आपको हर बार डेटाबेस से मॉडल को अपडेट करने के लिए यह करना होगा।


2
मैंने इसे गलती से वोट दिया था, लेकिन ऐसा नहीं था, लेकिन अब मैं वह नहीं कर सकता जो मैं करना चाहता था, जो इसे वोट कर रहा है! इस मुद्दे को खोजने के लिए धन्यवाद। अगर मैं सही तरीके से समझूं, तो डेटाबेस से मॉडल को अपडेट करने के कारण 2005 से 2008 तक मान बदल जाता है, जहां डेटाबेस SQL ​​2008 DB है? मेरे वातावरण में, मेरी डेवलपर मशीन में SQL 2008 है, लेकिन परीक्षण वातावरण में 2005 है (जिसका उत्पादन भी है)। जब तक हम 2008 में नहीं चले जाते, तब तक क्या मैं यह मानने के लिए सही हूं कि यह घटित होता रहेगा?
जेमीबारो

मैं आमतौर पर इसे 2005 में सेट करता हूं, जो उत्पादन डेटाबेस है; मैं विकास के लिए 2008 का उपयोग कर रहा हूं। 2008 पीछे की संगत है इसलिए कोई समस्या नहीं है। इसके अलावा अपडेट / जनरेट के बाद इसे वापस बदला जा सकता है। कड़वे अनुभव के बाद ईडीएमएक्स में जांच करने पर मैं हमेशा इसे सत्यापित करता हूं।
रिचर्ड हैरिसन

यह फिक्स मेरे लिए काम नहीं करता है ?? forum.asp.net/p/1770522/4838628.aspx/…
वेल्श किंग

इस LightSwitch में होता है, अपने ब्लॉग पोस्ट बताते हैं कि कैसे lsml फ़ाइल में इसे ठीक करने (एल एस में edmx फ़ाइल तक कोई सीधी पहुंच नहीं है के रूप में) देखें: lightswitchcentral.net.au/Blog/tabid/83/EntryId/27/ …
यन दुरान

यह एकमात्र समाधान है लेकिन आपको पता होना चाहिए कि आपको प्रत्येक बार edmx में संशोधन करते समय ऐसा करने की आवश्यकता होती है क्योंकि यह स्वयं को वापस कर देगा
डेव होगन

11

लाइन का त्वरित दृश्य:

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

10

यह बहुत निराशाजनक है और मुझे आश्चर्य है कि एमएस ने इसे बनाने का फैसला नहीं किया ताकि आप किसी दिए गए SQL संस्करण को लक्षित कर सकें। यह सुनिश्चित करने के लिए कि हम 2005 को लक्षित कर रहे हैं, मैंने एक सरल कंसोल ऐप लिखा है और इसे प्रीबिल्ड चरण में कॉल करें।

प्रीलिफ्ट स्टेप इस तरह दिखता है:

$(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 फाइलें हैं जिन्हें मुझे बदलने की आवश्यकता है, इसलिए एक परिनियोजन के बाद वापस लौटने के लिए एक समाधान कॉन्फ़िगरेशन जोड़ सकते हैं, और इसे सामान्य बिल्ड से निकाल सकते हैं। पूर्व-बिल्ड के बजाय पहले (या AfterBuild) इस उपयोगी उपकरण का उपयोग करने के लिए जानकारी के साथ अब एक उत्तर पोस्ट करेंगे। खूब सराहना मिली।
मेमेडेवेलर

3

ऊपर @ वेंस के काम के कंसोल ऐप का उपयोग करते हुए, मैंने निम्नलिखित को एक फर्स्टबिल्ड इवेंट के रूप में इस्तेमाल किया

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

यह सुपर आसान है, क्योंकि कष्टप्रद पुनर्वसन से बचा जाता है। Vance साझा करने के लिए धन्यवाद।

मैंने TF.exe को लाइब्रेरी सॉल्यूशन फोल्डर में जोड़ दिया है और यह मदद करता है, क्योंकि मैं अब उन्हें बनाने की कोशिश करने से पहले edmx फ़ाइलों की जांच कर सकता हूं, बिल्ड के हिस्से के रूप में। इसके अलावा, मैंने इसे शर्तों के साथ जोड़ दिया है, ताकि यह सर्वर पर तैनाती के लिए 2005 और देव मशीन sln कॉन्फ़िगरेशन के लिए 2008 तक वापस सेट हो जाए। इसके अलावा आपको लाइब्रेरी फ़ोल्डर में वास्तविक SetEdmxSqlVersion.exe (और .pdb) फ़ाइल (या जहाँ भी आप इन बिट्स रखना चाहते हैं) को जोड़ने की आवश्यकता है।

बहुत बहुत धन्यवाद @Vance वास्तव में साफ, बड़े पैमाने पर समय बचाने और मेरे बनाता है पूरी तरह से स्वचालित और दर्द मुक्त :)


2

2012 बनाम 2008 के साथ भी ऐसी ही समस्या थी। इसे 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 कार्य को एक त्रुटि कार्य के साथ बदल सकते हैं।


यह बाहरी निष्पादन योग्य का उपयोग करने से बहुत बेहतर है, MSBuild को आंतरिक रूप से सभी फैंसी-नेस को संभालने की अनुमति देता है। यह सभी CallTargetप्रकाशित / निर्माण कॉन्फ़िगरेशन के आधार पर सशर्त पूर्व-निर्माण लक्ष्य कार्यों के माध्यम से आसानी से जंजीर हो सकता है। (ईजी केवल एक sql2005 पर्यावरण के लिए तैनात करते समय बदल जाते हैं)
प्रशंसा

1

समान मुद्दे का सामना करने वाले लोगों के लाभ के लिए, लेकिन कोड फर्स्ट का उपयोग कर रहे हैं , कोड फर्स्ट में बदलाव कैसे करें, इस बारे में मेरा जवाब यहां देखेंProviderManifestToken । इसमें मॉडल बिल्डर की विधि को कॉल करते समय DbModelBuilderमैन्युअल रूप से और एक DbProviderInfoउदाहरण (उपयुक्त टोकन के साथ) को शामिल करना शामिल है Build


मुझे लगता है कि Type System Version=SQL Server 2005कनेक्शन स्ट्रिंग में सेट भी काम कर सकता है
कोड

0

मेरे लिए बेहतर समाधान मैन्युअल रूप से ईडीएमएक्स फ़ाइल को संपादित करने के बजाय डिज़ाइन मोड में केवल खुले edmx और "http से अपडेट मॉडल" के संदर्भ में है। आपको सही SQL संस्करण की ओर इशारा करना होगा जो भी आपके लिए है।


1
मुझे लगता है कि यह ओपी की समस्या है - वह एक स्थानीय एसक्यूएल 2008 के खिलाफ विकसित हुआ लेकिन फिर एसक्यूएल 2005 में तैनात किया गया।
स्टुअर्टएलसी

यह तब तक काम करता है जब तक कि आपके पास SQL ​​2005 आवृत्ति तक पहुँच न हो।
डार्सी

1
एक बड़ा नुकसान यह है कि यह एक मैनुअल कदम है, और इस तरह भूल जाएगा।
जौइन

0

हमारे पास SQL2005 v.3 पर यह त्रुटि थी, जहां हमारे पास SQL2005 v.4 पर नहीं था।

कनेक्शन स्ट्रिंग में SQL2005 जोड़ना हमारी विशिष्ट समस्या को ठीक करता है।

हमने अभी तक पहचान नहीं की है, और ऊपर दिए गए अनुसार टोकन प्रदान करने के लिए कोड को संशोधित नहीं करना चाहते थे (तैनाती के दौरान प्रकट हुआ मुद्दा)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.