डेटाबेस बनाने के बाद से <डेटाबेस> संदर्भ का समर्थन करने वाला मॉडल बदल गया है


253

त्रुटि संदेश:

"डेटाबेस बनाने के बाद से 'एड्रेसबुक' के संदर्भ का मॉडल बदल गया है। या तो डेटाबेस को मैन्युअल रूप से हटाएं / अपडेट करें, या डेटाबेस.नेटइन्सेलाइज़र को IDatabaseInitializer उदाहरण के साथ कॉल करें। उदाहरण के लिए, recreateDatabaseImodelChanges की रणनीति डेटाबेस को स्वचालित रूप से हटा और फिर से बनाएगी, और। वैकल्पिक रूप से नए डेटा के साथ इसे बीज दें। "

मैं कोड-पहली सुविधा का उपयोग करने की कोशिश कर रहा हूं और मैंने जो लिखा है वह निम्नलिखित है:

var modelBuilder = new ModelBuilder();
var model = modelBuilder.CreateModel();
using (AddressBook context = new AddressBook(model))
{
    var contact = new Contact
    {
        ContactID = 10000,
        FirstName = "Brian",
        LastName = "Lara",
        ModifiedDate = DateTime.Now,
        AddDate = DateTime.Now,
        Title = "Mr."

    };
    context.contacts.Add(contact);
    int result = context.SaveChanges();
    Console.WriteLine("Result :- "+ result.ToString());
}

संदर्भ वर्ग:

public class AddressBook : DbContext
{
    public AddressBook()
    { }
    public AddressBook(DbModel AddressBook)
        : base(AddressBook)
    {

    }
    public DbSet<Contact> contacts { get; set; }
    public DbSet<Address> Addresses { get; set; }
}

और कनेक्शन स्ट्रिंग:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <connectionStrings>
    <add name="AddressBook" providerName="System.Data.SqlClient"  
         connectionString="Data Source=MyMachine;Initial Catalog=AddressBook;
         Integrated Security=True;MultipleActiveResultSets=True;"/>
    </connectionStrings>
</configuration>

इसलिए, डेटाबेस का नाम "एड्रेसबुक" है और त्रुटि तब होती है जब मैं संपर्क ऑब्जेक्ट को संदर्भ में जोड़ने की कोशिश कर रहा हूं। क्या मुझसे यहां कुछ छूट रहा है?



अपने डेटाबेस से __ माइग्रेशनहिस्टर टेबल निकालें
जाहिद हसन

जवाबों:


397

अब यह:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    Database.SetInitializer<YourDbContext>(null);
    base.OnModelCreating(modelBuilder);
}

आपकी YourDbContext.cs फ़ाइल में।


मैंने अपना प्रोडक्शन डीबी मैन्युअल रूप से बदल दिया है और माइग्रेशन को बंद कर दिया है और यह काम करता है, धन्यवाद
मोहसिन अफशिन

13
Ps, यह Global.asax Application_Start () में चला जाता है
BritishDeveloper

48
Global.asax से बेहतर यह है कि इसे अपने DbContext क्लास के कंस्ट्रक्टर में डालें। इस तरह यह Global.asax फ़ाइल द्वारा नियंत्रित केवल एक साइट के बजाय संदर्भ का उपयोग करते हुए हर साइट के लिए काम करता है।
कोरिन

7
संभवत: इसे संदर्भ वर्ग के स्थिर प्रतिक्षेपक में रखना सबसे अच्छा है, इसलिए इसे केवल एक ही बार कहा जाता है - जैसा कि इस उदाहरण वीडियो में है: msdn.microsoft.com/en-us/data/jj572367
क्रिश्चियन फ्रेड

3
इसे संरक्षित ओवरराइड शून्य ओनमोडेलक्रिटिंग (DbModelBuilder मॉडलबाली) के अंदर रखा जाना चाहिए। base.OnModelCreating (modelBuilder); }
क्रिस वून

135

जेफ द्वारा पोस्ट किए गए स्कॉट गु के ब्लॉग की कुछ जानकारी यहां दी गई है कि वास्तव में क्या हो रहा है:

उन लोगों के लिए जो इस अपवाद को देख रहे हैं:

"डेटाबेस के निर्माण के बाद से 'उत्पादन' संदर्भ का मॉडल बदल गया है। या तो डेटाबेस को मैन्युअल रूप से हटाएं / अपडेट करें, या Database.SetInitializerएक IDatabaseInitializerउदाहरण के साथ कॉल करें ।"

यहाँ क्या हो रहा है और इसके बारे में क्या करना है:

जब कोई मॉडल पहली बार बनाया जाता है, तो हम डेटाबेस बनाने के लिए डेटाबेसइंटरिलाइज़र चलाते हैं जैसे कि अगर यह नहीं है या बीज डेटा जोड़ें तो डेटाबेस बनाएँ। डिफ़ॉल्ट डेटाबेसइन्सेन्टलाइज़र डेटाबेस में बनाए गए स्कीमा के एक हैश के साथ एडमामेटाटा तालिका में संग्रहीत डेटाबेस का उपयोग करने के लिए आवश्यक डेटाबेस स्कीमा की तुलना करने की कोशिश करता है जो डेटाबेस के साथ बनाया जाता है (जब कोड फर्स्ट डेटाबेस बनाने वाला होता है)। मौजूदा डेटाबेस में EdmMetadata तालिका नहीं होगी और इसलिए हैश नहीं होगा ... और कार्यान्वयन आज फेंक देगा यदि वह तालिका गायब है। फ़ायल संस्करण को जहाज करने से पहले हम इस व्यवहार को बदलने पर काम करेंगे क्योंकि यह डिफ़ॉल्ट है। तब तक, मौजूदा डेटाबेस को आमतौर पर किसी भी डेटाबेस इनिशियलाइज़र की आवश्यकता नहीं होती है, इसलिए इसे कॉल करके आपके संदर्भ प्रकार के लिए बंद किया जा सकता है:

Database.SetInitializer<YourDbContext>(null);

जेफ


9
मैंने आज यह कोशिश की, और मुझे अब "मॉडल बदल गया है" नहीं मिलता है, इसके बजाय मुझे "अमान्य वस्तु का नाम 'dbo.Table' मिलता है
स्टीफन

3
जेफ चाहते थे कि यह वर्कअराउंड हो, लेकिन दो साल से अधिक समय हो चुका है और सेट इनसाइडलाइजर टू नाउल अभी भी आवश्यक है। सही? तो क्या कोई यह समझा सकता है कि यह माइग्रेशन वर्कफ़्लो में कैसे फिट बैठता है।
kroiz

2
@jakejgordon: मुझे भी EF6 के साथ लेकिन अगर यह Global.asax में है, तो यह केवल वेबसाइट चलाते समय समस्या को ठीक करता है। यदि आपके पास इकाई परीक्षण हैं, तो आप OOL हैं। इसे YourDbContext के कंस्ट्रक्टर में डालना बेहतर है। यह वेबसाइट और परीक्षण परियोजनाओं सहित हर परियोजना के लिए इसे ठीक करता है।
रैप

1
IMO, यह उत्तर उच्चतर होना चाहिए क्योंकि यह वास्तव में बताता है कि हमें इस कोड को जोड़ने की आवश्यकता क्यों है । धन्यवाद।
पॉल

1
@StefanBergfeldt अगर आप या कोई भी Invalid object name 'dbo.Tableआपके कनेक्शन की जाँच करवाता है तो स्ट्रिंग संलग्न करेंफिलनेम और प्रारंभिक सूची
benscabbia

41

के लिए इकाई की रूपरेखा 5.0.0.0 - 6.1.3

आप करते वास्तव में निम्नलिखित क्या करना चाहते हैं:

1. using System.Data.Entity;   to startup file (console app --> Program.cs / mvc --> global.asax
2. Database.SetInitializer<YourDatabaseContext>(null);

हाँ, मैट फियर सही है। अद्यतन करें: चेतावनी यह है कि मैं इस कोड को वैश्विक में जोड़ने के बजाय दूसरों से सहमत हूं। इस पर आपके DbContext वर्ग में जोड़ा गया

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    // other code 
    Database.SetInitializer<YOURContext>(null);
    // more code here.
}

जैसा कि दूसरों ने उल्लेख किया है कि यह इकाई परीक्षण को संभालने के लिए भी अच्छा है।

वर्तमान में मैं इकाई फ्रेमवर्क 6.1.3 /.net 4.6.1 के साथ इसका उपयोग कर रहा हूं

मैं निकट भविष्य में CORE स्निपेट प्रदान करने के लिए वापस आऊंगा।


1
धन्यवाद! Program.cs निश्चित रूप से कंसोल के लिए काम करती है।
20

लेकिन जब आप पहली बार अपने डेटाबेस को इनिशियलाइज़ करते हैं तो यह डेटाबेस नहीं बना रहा होता है अगर मैं सेटमोनिटाइज़र को ऑनमोडेलक्रिएट विधि में डाल देता हूँ। कोई विचार ? Eventhoug मैं (var संदर्भ = Activator.CreateInstance <TContext> ()) {reference.Database.Initialize (true) का उपयोग कर रहा हूं; }
रूपेश कुमार तिवारी

मुझे अपना कोड खोजने की आवश्यकता है जिसका उपयोग मैं कभी-कभी एक पंक्ति और स्वैप टिप्पणी करूँगा ... मुझे इस मुद्दे को याद नहीं करना है, मुझे देखने की आवश्यकता है।
टॉम स्टिकेल

1
सबसे अच्छा समाधान। यह मेरे समाधान को चलाने का कारण बनता है, और मुझे नहीं पता कि क्या प्रभाव हैं। प्रतिबद्ध और तैनात।
स्वेन्द


31

यह फिक्स CTP5 के बाद काम नहीं करता है।

आप को करना पड़ेगा Database.SetInitializer<YourContext>(null);


1
वह कहाँ जाता है ... OnModelCreating के पास DbDatabase
James Reategui

स्टार्टअप में कहीं, मैं Application_Start में मेरा सेट।
क्रिसर्टमैन

डेटाबेस। Inetizerizer EF 4.3 अंतिम रिलीज़ में ठीक काम करता है।
रिचर्ड बीयर

मुझे लगता है कि "यह फिक्स अब CTP5 के बाद काम नहीं करता है" का अर्थ है कि 30 अगस्त 2010 से स्वीकृत उत्तर वह कह रहा है।
टॉम स्टिकेल

19

बस जवाब मिल गया और यहाँ अपडेट करने की सोची। बस निम्नलिखित करने की जरूरत है।

public class AddressBook: DbContext
{
   protected override void OnModelCreating(ModelBuilder modelBuilder)
   {
    modelBuilder.IncludeMetadataInDatabase = false;
   }
}

12
यह EF के बाद के संस्करणों के साथ संभव नहीं है, यह भी modelBuilder.Conventions.Remove<IncludeMetadataConvention>();स्थिति में मदद नहीं करता है। DbDatabase.SetInitialzer (शून्य); काम करेगा।
JTew

@TomStickel - मैं सहमत हूँ। चिह्नित stackoverflow.com/a/6143116/255562 जवाब के रूप में।
आशीष गुप्ता

16

या आप इस लाइन को अपने Global.asax.cs फ़ाइल में Application_Start () के तहत रख सकते हैं:

System.Data.Entity.Database.SetInitializer(new System.Data.Entity.DropCreateDatabaseIfModelChanges<ProjectName.Path.Context>());

ProjectName.Path.Context को अपने नाम स्थान और संदर्भ में बदलना सुनिश्चित करें। यदि पहले कोड का उपयोग किया जाता है तो यह स्कीमा में कोई भी परिवर्तन करने पर एक नया डेटाबेस हटा देगा और बना देगा।


वास्तव में मुझे क्या चाहिए, क्योंकि मैं केवल प्रोटोटाइप बना रहा था। बहुत बहुत धन्यवाद।
शिक्षार्थी

8

मैंने इस मुद्दे को हल करने के लिए कई दिन बिताए, कई अलग-अलग पोस्टों का विश्लेषण किया और कई विकल्पों की कोशिश की और अंत में तय किया। EF कोड पहले माइग्रेशन का उपयोग करके मेरे समाधान में यह 2 परियोजनाएं:

  • कंसोल एप्लिकेशन "डेटामॉडल" जो मुख्य रूप से असेंबली के रूप में उपयोग कर रहा है जिसमें मेरे सभी कोड पहली इकाइयां, डीबीसीकोटेक्स्ट, मिर्गेशन और जेनेरिक रिपॉजिटरी हैं। मैंने इस प्रोजेक्ट को अलग-अलग खाली स्थानीय डेटाबेस फ़ाइल (DataModel / App_Data फ़ोल्डर में) में शामिल किया है ताकि पैकेज मैनेजर कंसोल से माइग्रेशन उत्पन्न किया जा सके।
  • WebApi, जो DataModel परियोजना के संदर्भ में है और WebApi / App_Data फ़ोल्डर से स्थानीय डेटाबेस फ़ाइल का उपयोग करता है, जो परियोजना में शामिल है

WebApi के अनुरोध पर मुझे यह त्रुटि मिली ...

मेरा वातावरण:

  • विंडोज 8.1 x64
  • अपडेट 1 के साथ विजुअल स्टूडियो 2015 प्रोफेशनल
  • मेरी सभी परियोजनाएँ .NET फ्रेमवर्क 4.6.1 के लिए लक्षित हैं
  • एनटगेट से EntityFramework 6.1.3

यहां मैंने उन सभी टिप्पणियों को एकत्र किया, जिन पर आपको ध्यान देना चाहिए और सभी शर्तों / आवश्यकताओं को पूरा करना चाहिए, जिनका उल्लेख अपवाद से बचने के लिए किया जाना चाहिए:

  1. आपको अपने समाधान में सभी परियोजनाओं के लिए EntityFramework Nuget पैकेज के केवल एक संस्करण का उपयोग करना चाहिए।
  2. डेटाबेस, क्रमिक रूप से सभी माइग्रेशन स्क्रिप्ट को चलाकर बनाया गया है, जिसमें एक ही संरचना / स्कीमा होना चाहिए जैसा कि आप डेटाबेस को लक्षित करते हैं और इकाई मॉडल के अनुरूप होते हैं। निम्नलिखित 3 चीजों को एक-दूसरे से बिल्कुल मेल / प्रतिबिंबित / मेल करना चाहिए:
    • आपकी सभी माइग्रेशन स्क्रिप्ट अंतिम तक रहती हैं
    • वर्तमान कोड पहली इकाई मॉडल राज्य (DbContext, संस्थाओं)
    • लक्ष्य डेटाबेस
  3. लक्ष्य डेटाबेस (mdf फ़ाइल) को अद्यतन किया जाना चाहिए / अंतिम माइग्रेशन स्क्रिप्ट के अनुरूप होना चाहिए। सत्यापित करें कि आपके लक्ष्य डेटाबेस में "__MigrationHistory" तालिका में आपके पास मौजूद सभी माइग्रेशन स्क्रिप्ट्स के लिए रिकॉर्ड हैं, इसका मतलब है कि सभी माइग्रेशन स्क्रिप्ट्स को सफलतापूर्वक उस डेटाबेस पर लागू किया गया था। मैं आपको सलाह देता हूं कि आप अपने सिस्टम, प्रोजेक्ट -> नई आइटम जोड़ें -> ADO.NET इकाई डेटा मॉडल -> कोड पहले डेटाबेस से मेल खाती है, पीढ़ी दर पीढ़ी पहले कोड और संदर्भ के लिए विजुअल स्टूडियो का उपयोग करें: बेशक, एक विकल्प के रूप में, यदि आपके पास कोई डेटाबेस नहीं है जिसे आप मैन्युअल रूप से मॉडल (कोड पहले इकाइयां और संदर्भ) लिख सकते हैं और फिर प्रारंभिक माइग्रेशन और डेटाबेस उत्पन्न कर सकते हैं।
  4. कनेक्शन स्ट्रिंग का नाम उदा । स्टार्टअप परियोजना की वेब फ़ाइल में MyConnectionString (Web.config / App.config):

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>

    आपके DbContext के निर्माण में पारित पैरामीटर के बराबर होना चाहिए:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. पैकेज मैनेजर कंसोल का उपयोग करने से पहले , सुनिश्चित करें कि आप अपडेट के लिए सही डेटाबेस का उपयोग कर रहे हैं या माइग्रेशन उत्पन्न करते हैं और आवश्यक प्रोजेक्ट को समाधान के स्टार्टअप प्रोजेक्ट के रूप में सेट किया गया है डेटाबेस से कनेक्ट करने के लिए यह उस .config फ़ाइल से कनेक्शन स्ट्रिंग का उपयोग करेगा, जो प्रोजेक्ट में, स्टार्टअप प्रोजेक्ट के रूप में सेट है।
  6. और मुख्य, जिसने मेरा मुद्दा तय किया: यह अजीब है, लेकिन मेरे WebApi / बिन फ़ोल्डर में DataModel.exe पुराना था, पिछले बिल्ड के बाद से ताज़ा नहीं हुआ था। चूंकि माइग्रेशन को मेरी असेंबली DataModel.exe में एम्बेड किया गया था, इसलिए मेरे वेबएपीआई पुराने डेटाबेस का उपयोग करके अपडेटेड डेटाबेस। मैं भ्रमित था कि WebApi में डेटाबेस अपडेट करने के बाद यह DataModel की नवीनतम माइग्रेशन स्क्रिप्ट से मेल नहीं खाता। निम्नलिखित कोड स्वचालित रूप से (यदि मौजूद नहीं है) या मेरे WebApi / App_Data फ़ोल्डर में नवीनतम स्थानीय डेटाबेस को अद्यतन करता है।

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...

    मैंने स्वच्छ और पुनर्निर्माण के समाधान की कोशिश की, लेकिन यह मदद नहीं की, जैसे मैंने WebApi से बिन और obj फ़ोल्डर्स को पूरी तरह से हटा दिया, WebApi / App_Data से डेटाबेस फ़ाइलों को हटा दिया, WebApi को फिर से शुरू किया, इसके लिए अनुरोध किया, इसने सही डेटाबेस बनाया - आलसी आरंभीकरण (उपयोग करके) ऊपर लाइनें), जो नवीनतम माइग्रेशन और अपवाद से मेल खाती है, अधिक दिखाई नहीं दिया। तो, यह आपकी समस्या को ठीक कर सकता है:

    1. अपने स्टार्टअप प्रोजेक्ट से मैन्युअल रूप से बिन, ओबज फ़ोल्डर्स को हटा दें (जो आपके डेटाबेस को उत्पन्न / अपडेट करता है)
    2. अपनी स्टार्टअप परियोजना या बेहतर स्वच्छ निर्माण और आप सभी के समाधान का पुनर्निर्माण करें।
    3. प्रोजेक्ट शुरू करके डेटाबेस को फिर से बनाएँ (ऊपर दी गई लाइनों को निष्पादित करेगा) या पैकेज मैनेजर कंसोल "अपडेट-डेटाबेस" कमांड का उपयोग करें।
    4. मैन्युअल रूप से जांचें कि क्या डीबी और __MirgationHistory नवीनतम माइग्रेशन स्क्रिप्ट से मेल खाती है।

5

मेरे लिए, 4.3.1 में अपग्रेड के साथ, मैं सिर्फ EdmMetaData टेबल को छोटा करता हूं या इसे एकमुश्त हटा देता हूं।


मैंने ४.३.१ तक अद्यतन किया और फिर सिर्फ एडम्माटाडाटा तालिका का नाम बदला। मैं अब आवश्यकतानुसार मॉडल में परिवर्तन कर सकता हूं और मॉडल बैकिंग ब्ला ब्ला के बारे में अधिक कष्टप्रद त्रुटि संदेश नहीं।
अशोक पद्मनाभन

3

VB.NET डेवलपर्स के लिए:

निम्न लाइन को Glabal.asax.vb फ़ाइल में विधि के अंत में जोड़ें Application_Start ()

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

ApplicationDbContext को अपने विशिष्ट Db संदर्भ में बदलें।


2

मेरे पास यह मुद्दा था और यह पता चला कि एक परियोजना एसक्यूएलएक्सप्रेस की ओर इशारा कर रही थी, लेकिन समस्या वाला एक स्थान स्थानीय बैंक की ओर इशारा कर रहा था। (उनके संबंधित web.config में)। मूर्खतापूर्ण निरीक्षण, लेकिन यहाँ ध्यान देने योग्य बात यह है कि कोई और इस समस्या का निवारण कर रहा है।


2

इसका अर्थ है कि इस संदर्भ में कुछ बदलाव किए गए थे जिन्हें निष्पादित नहीं किया गया है। कृपया हमारे द्वारा किए गए परिवर्तनों (जिन परिवर्तनों को हम नहीं जानते हैं) को उत्पन्न करने के लिए पहले ऐड-माइग्रेशन चलाएं और फिर अपडेट-डेटाबेस चलाएं


2

मेरे पास एक ही मुद्दा था - माइग्रेशन को फिर से जोड़ना और डेटाबेस को अपडेट करना काम नहीं करता था और ऊपर दिए गए उत्तरों में से कोई भी सही नहीं लगता था। तब प्रेरणा ने मुझे मारा - मैं कई स्तरों (एक वेब, एक डेटा और एक व्यवसाय) का उपयोग कर रहा हूं। डेटा लेयर में संदर्भ और सभी मॉडल होते हैं। वेब परत ने इस अपवाद को कभी नहीं फेंका - यह व्यवसाय की परत थी (जिसे मैंने परीक्षण और डिबगिंग के लिए कंसोल एप्लिकेशन के रूप में सेट किया है)। कारोबार परत बाहर मुड़ता है db पाने के लिए और संदर्भ बनाने के लिए सही कनेक्शन स्ट्रिंग का उपयोग नहीं कर रहा था। इसलिए मैंने व्यावसायिक स्ट्रिंग (और डेटा लेयर) के ऐप कॉन्फिगरेशन में कनेक्शन स्ट्रिंग जोड़ दी और यह काम करता है। इसे दूसरों के लिए यहां रखा जाए जो समान मुद्दे का सामना कर सकें।


1

मैं इसका उपयोग करने से पहले मॉडल और DB मैच के परीक्षण के लिए Database.CompatibleWithModel विधि (EF5 में उपलब्ध) का उपयोग करता हूं। मैं इस विधि को संदर्भ बनाने के बाद कहता हूं ...

        // test the context to see if the model is out of sync with the db...
        if (!MyContext.Database.CompatibleWithModel(true))
        {
            // delete the old version of the database...
            if (File.Exists(databaseFileName))
                File.Delete(databaseFileName);
            MyContext.Database.Initialize(true);

            // re-populate database

        }

1

अच्छा सुझाव, हालाँकि, सभी मामलों में इतना सटीक है। मैं एक पता लगाता हूं। कृपया आपको यह सुनिश्चित करने की आवश्यकता है कि आप विजुअल स्टूडियो में पीएम विंडो का उपयोग करके "सक्षम-माइग्रेशन" चलाएं, और माइग्रेशन फ़ोल्डर आपको प्रोजेक्ट में जोड़ा जाएगा।

सुनिश्चित करें कि फ़ोल्डर में जोड़े गए दो सी # क्लास की फाइलें आपके सभी मॉडल और उनके संबंधित गुणों में शामिल होंगी।

यदि आपके पास समाधान का निर्माण करने वाले सभी, और तैनाती के लिए पबिसिस हैं।

तर्क यह है कि मौजूदा मेटाडेटा को अधिलेखित नहीं किया जा सकता है क्योंकि आपके आवेदन में वर्तमान को बदलने के लिए कोई मेटाडेटा नहीं है। परिणामस्वरूप आपको यह त्रुटि मिल रही है "डेटाबेस बनाने के बाद से संदर्भ का मॉडल बदल गया है"


1

बस किसी के मामले में मेरा जैसा ही परिदृश्य है।

मेरे पास पहले EF और उसी समय asp.net पहचान का उपयोग करके डेटाबेस है

इसलिए मेरे वेबकॉन्फ़िग में दो कनेक्शनस्ट्रीम हैं, और इसके साथ कोई समस्या नहीं है। ऐसा हुआ कि मैंने स्क्रिप्ट्स को मैन्युअल रूप से asp.net आइडेंटी टेबल बनाने के लिए बनाया / चलाया जो मुझे नहीं करना चाहिए।

इसलिए DROP सबसे पहले सभी asp.net आइडेंटीफिकेशन टेबल को आपके द्वारा स्वयं / स्क्रिप्ट से बनाया जाता है।

DROP TABLE __MigrationHistory
DROP TABLE AspNetRoles
DROP TABLE AspNetUserClaims
DROP TABLE AspNetUserLogins
DROP TABLE AspNetUserRoles
DROP TABLE AspNetUsers

1

इनमें से कोई भी समाधान हमारे लिए काम नहीं करेगा (स्कीमा जाँच पूरी तरह से अक्षम करने के अलावा)। अंत में हमारे न्यूटनसॉफ्ट.जॉन के संस्करण में एक मिस-मैच हुआ

हमारा AppConfig सही से अपडेट नहीं हुआ:

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="7.0.0.0" />
  </dependentAssembly>

समाधान यह था कि हम वास्तव में जो तैनाती कर रहे थे, उसके लिए विधानसभा संस्करण को सही किया जाए

<dependentAssembly>
   <assemblyIdentity name="Newtonsoft.Json" publicKeyToken="30ad4fe6b2a6aeed" culture="neutral" />
    <bindingRedirect oldVersion="0.0.0.0-7.0.0.0" newVersion="10.0.0.0" />
  </dependentAssembly>

जब हम समस्या को हल किया गया था संस्करण को अद्यतन करते हैं तो हमें Newtonsoft.json के संस्करण के साथ एक परिचित समस्या थी।
रुई एस्ट्रेइटो

0

इस विषय पर कुछ शोध के बाद, मैंने पाया कि त्रुटि मूल रूप से उत्पन्न होती है यदि आपके पास अपने स्थानीय वर्ग सर्वर एक्सप्रेस पर पहले निर्मित db का उदाहरण है। इसलिए जब भी आपके पास db पर अपडेट आए और db को अपडेट करने का प्रयास करें / Update Databaseकमांड का उपयोग किए बिना चलने पर db पर कुछ कोड चलाएं Package Manager Console; सबसे पहले, आपको मैन्युअल रूप से हमारे स्थानीय एसक्यूएल एक्सप्रेस पर पिछले डीबी को हटाना होगा।

इसके अलावा, यह समाधान तब तक काम करता है जब तक AutomaticMigrationsEnabled = false;आपके कॉन्फ़िगरेशन में नहीं है।

यदि आप एक संस्करण नियंत्रण प्रणाली (git, svn, आदि) के साथ काम करते हैं और कुछ अन्य डेवलपर्स उत्पादन चरण में db ऑब्जेक्ट को अपडेट करते हैं तो यह त्रुटि तब उठती है जब भी आप अपना कोड आधार अपडेट करते हैं और एप्लिकेशन चलाते हैं।

जैसा कि ऊपर कहा गया है, कोड आधार पर इसके लिए कुछ समाधान हैं। हालांकि, कुछ मामलों के लिए यह सबसे व्यावहारिक है।


0

मैं प्रो ASP.NET MVC 4 पुस्तक को भी पढ़ रहा हूं, और उसी समस्या में भाग रहा हूं जो आप कर रहे थे। मेरे लिए, मुझे पुस्तक के id एडिंग मॉडल वैलिडेशन ’खंड में निर्धारित परिवर्तन करने के बाद समस्या होने लगी। जिस तरह से मैंने समस्या का समाधान किया है वह मेरे डेटाबेस को लोकलडब से पूर्ण-पूर्ण SQL सर्वर 2012 सर्वर पर ले जाकर है। (BTW, मुझे पता है कि मैं भाग्यशाली हूं कि मैं पूर्ण विकसित संस्करण पर स्विच कर सकता हूं, इसलिए मुझसे नफरत मत करो;;;)) db को संचार के साथ कुछ होना चाहिए जो समस्या पैदा कर रहा है।


आप कैसे जानते हैं कि यह db के लिए संचार है, और उदाहरण के लिए इसका मेटाडेटा नहीं है?
flup

2
देरी से जवाब देने के लिए माफी। यह पता चला है कि यह एक संचार मुद्दा नहीं है! Db को फिर से बनाने से समस्या का सामना करना पड़ा, क्योंकि मुझे फिर से वही समस्या मिली! A __Migrationxxx (तालिका का सटीक नाम याद नहीं कर सकता क्योंकि मैंने इसे अभी हटा दिया है) ef द्वारा बनाया गया है। बस इसे हटा दें और आपको सब अच्छा होना चाहिए।
J3Speaks 16

@ MyJ3 सभी लोग इन सभी फ्रिगिन लाइनों और कोड की पंक्तियों को टटोलते हैं। यह सब मुझे चाहिए था! उत्तर (वैकल्पिक परिदृश्य) होना चाहिए।
Terrance00

@ Terrance00 धन्यवाद!
J3Speaks

0

इस निम्नलिखित चरणों की जाँच करें

  1. Database.SetInitializer (शून्य); -> Global.asax.cs में

2।

  1. आपके संदर्भ वर्ग का नाम इसे जाँच के साथ मेल खाना चाहिए

0

के साथ घटना Global.asax.csसहित संशोधित करें Application_Start:

Database.SetInitializer<YourDatabaseContext>(
 new DropCreateDatabaseIfModelChanges<YourDatabaseContext>());

5
मैं इस बारे में थोड़ा स्पष्ट होऊंगा कि यह व्यक्तिगत रूप से क्या करता है।
केसी

3
नहीं, नहीं, मैं 99% समय DropCreateDatabaseIfModelChanges का उपयोग नहीं करना चाहता!
टॉम स्टिकेल

0

यह त्रुटि आपके कनेक्शन स्ट्रिंग के साथ किसी समस्या को इंगित कर सकती है और क्या आपका कनेक्शन स्ट्रिंग नाम डेटाबेस संदर्भ घोषणा से मेल खाता है।

मुझे यह त्रुटि थी क्योंकि मैंने स्थानीय डेटाबेस को गलत तरीके से (मूर्खतापूर्ण गलती) का नाम दिया था और "DefaultConnection" के web.config में कनेक्शन स्ट्रिंग का नाम MyDbContext से मेल नहीं खाता था

public MyDbContext(): base("DefaultConnection")
{}


<connectionStrings>
    <add name="DefaultConnection" ...
  </connectionStrings>

0

डेटाबेस SetInitializer का उपयोग करने का प्रयास करें जो System.Data.Entity का उपयोग करता है;

Global.asax में

protected void Application_Start()
{
    Database.SetInitializer(new DropCreateDatabaseIfModelChanges<yourContext>());
}

यह आपके डेटाबेस को बदलने के लिए हर बार नया डेटाबेस बनाएगा। लेकिन आपके डेटाबेस खाली हो जाएगा। डमी डेटा के साथ इसे भरने के लिए आप सीडिंग का उपयोग कर सकते हैं। जिसे आप के रूप में कार्यान्वित कर सकते हैं:

सीडिंग ::

protected void Application_Start()
{
    Database.SetInitializer(new AddressBookInitializer());
                ----rest code---
}
public class AddressBookInitializer : DropCreateDatabaseIfModelChanges<AddressBook>
{
    protected override void Seed(AddressBook context)
    {
        context.yourmodel.Add(
        {

        });
        base.Seed(context);
    }

}

0

यह अजीब है, लेकिन यहां सभी जवाब मेरे लिए बेकार थे। मेरे लिए शुरुआती काम किया

MigrateDatabaseToLatestVersion

यहां मेरा समाधान है (मुझे पता है, यह बहुत सरल हो सकता है, लेकिन यह है कि मैं इसे कैसे उपयोग करता हूं):

class MyDbMigrateToLatest : MigrateDatabaseToLatestVersion<MyDbContext, Configuration>
{
}

public class MyDbContext: DbContext
{
    public MyDbContext() : base("DbName")
    {
        SetInitializer();
    }

    public MyDbContext(string connString) : base(connString)
    {
        SetInitializer();
    }

    private static void SetInitializer()
    {
        if (ConfigurationManager.AppSettings["RebuildDatabaseOnStart"] == "true")
            Database.SetInitializer(new MyDbInitializerForTesting());
        else
            Database.SetInitializer(new MyDbMigrateToLatest());
    }
}

public sealed class Configuration : DbMigrationsConfiguration<MyDbContext>
{
    public Configuration()
    {
        AutomaticMigrationsEnabled = true;
    }

    protected override void Seed(MyDbContext context)
    {
        // Whatever
    }
}

MyDbInitializerForTesting बस कुछ विशिष्ट मामले (परीक्षण) में DropCreateDatabaseAlways से विरासत में मिला है, पूरे डेटाबेस का पुनर्निर्माण किया जाता है। अन्यथा यह नवीनतम संस्करण में माइग्रेट हो गया है।

मेरा स्रोत: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific


0

मुझे एक ही समस्या थी जब हमने दो अनुप्रयोगों के लिए एक डेटाबेस का उपयोग किया था। disableDatabaseInitialization="true"संदर्भ प्रकार अनुभाग में सेट करना मेरे लिए काम करता है।

<entityFramework>
<providers>
  <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
</providers>
<contexts>
  <context type="PreferencesContext, Preferences" disableDatabaseInitialization="true">
    <databaseInitializer type="System.Data.Entity.MigrateDatabaseToLatestVersion`2[[PreferencesContext, Preferences], [Migrations.Configuration, Preferences]], EntityFramework" />
  </context>
</contexts>

अधिक विवरण देखें https://msdn.microsoft.com/en-us/data/jj556606.aspx


0

कस्टम संदर्भ इनिशियलाइज़र बनाएँ:

public class MyDbContextInitializer : MigrateDatabaseToLatestVersion<MyDbContext, Migrations.Configuration>
{
    public override void InitializeDatabase(MyDbContext context)
    {
        bool exists = context.Database.Exists();

        base.InitializeDatabase(context);

        if (!exists)
        {         
            MyDbSeed.Seed(context);
        }
    }       
}

ध्यान दें कि Migrations.Configuration पैकेज प्रबंधक कंसोल में माइग्रेशन कमांड लाइन द्वारा उत्पन्न एक वर्ग है। आपको Migrations.Configuration क्लास के सार्वजनिक संशोधक में आंतरिक बदलने की आवश्यकता हो सकती है।

और इसे अपने OmModelCreating से पंजीकृत करें:

public partial class MyDbContext : DbContext
{

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        Database.SetInitializer<MyDbContext>(new MyDbContextInitializer());

        //other code for creating model
    }
}

-1

यहां मैं एक और तरीका साझा करना चाहता हूं जो संदर्भ बदलने पर मॉडल बैकिंग की त्रुटि को रोकता है:

1) अपनी DbContext फाइल को खोलें

2) Microsoft.AspNet.Identity.EntityFramework का उपयोग करके नामस्थान जोड़ें;

3) सार्वजनिक MyDbContext (): आधार ("नाम = MyDbContext") {Database.SetInitializer (नई DropCreateDatabaseAlways ()); }

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