<ডেটাবেস> প্রসঙ্গটি সমর্থন করে মডেলটি ডাটাবেস তৈরি হওয়ার পরে পরিবর্তিত হয়েছে


253

ত্রুটি বার্তা:

"ডাটাবেস তৈরি হওয়ার পর থেকেই 'অ্যাড্রেসবুক' প্রসঙ্গে মডেলটি বদলেছে ither বিকল্পভাবে এটি নতুন ডেটা সহ বীজ করুন।

আমি কোড-প্রথম বৈশিষ্ট্যটি ব্যবহার করার চেষ্টা করছি এবং নিম্নলিখিতটি আমি লিখেছি:

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>

সুতরাং, ডাটাবেসটির নাম "অ্যাড্রেসবুক" এবং ত্রুটি ঘটে যখন আমি প্রসঙ্গে যোগাযোগের অবজেক্টটি যুক্ত করার চেষ্টা করি। আমি কি এখানে কিছু মিস করছি?



আপনার ডাটাবেস থেকে __MigrationHistory টেবিলটি সরিয়ে দিন
জাহিদ হাসান

উত্তর:


397

এখন এটা:

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

আপনার YouDbContext.cs ফাইলে।


আমি আমার প্রযোজনার ডিবি নিজেই পরিবর্তন করেছি এবং মাইগ্রেশনটি বন্ধ করে দিয়েছি এবং এটি কাজ করে, ধন্যবাদ
মোহসেন আফশিন

13
পিএস, এটি গ্লোবাল.এক্সএক্স অ্যাপ্লিকেশন_সার্ট ()
ব্রিটিশ ডেভেলপার

48
গ্লোবাল.এক্সএক্সের চেয়ে ভাল এটি আপনার ডিবিকন্টেক্সট ক্লাসের কনস্ট্রাক্টরে রেখে দেওয়া। এইভাবে এটি Global.asax ফাইল দ্বারা নিয়ন্ত্রিত কেবলমাত্র একটি সাইটের চেয়ে প্রসঙ্গটি ব্যবহার করে প্রতিটি সাইটের জন্য কাজ করে।
করিন

7
সম্ভবত সেরা প্রসঙ্গ ক্লাসের স্ট্যাটিক contructor এটা করা, তাই এটি শুধুমাত্র বলা হচ্ছে একবার - এই উদাহরণে ভিডিওতে হিসাবে: msdn.microsoft.com/en-us/data/jj572367
খ্রিস্টান Fredh

3
এটি সুরক্ষিত ওভাররাইড অকার্যকর অনমোডেলক্রিয়াটিংয়ের (ডিবিমোডেলবিল্ডার মডেলবিল্ডার) ভিতরে স্থাপন করা উচিত {ডাটাবেস.সেটআইনিটিয়ালাইজার <ইয়োরডিবি কনটেক্সট> (নাল); base.OnModelCreating (modelBuilder); }
ক্রিস ভুন

135

স্কট গু-র ব্লগের কিছু তথ্য এখানে জেফ পোস্ট করেছেন যা আসলে ঘটছে:

যারা এই ব্যতিক্রমটি দেখছেন তাদের জন্য:

"ডাটাবেস তৈরি হওয়ার পর থেকেই 'প্রোডাকশন' প্রসঙ্গে ব্যাক মডেলটির পরিবর্তন হয়েছে ither হয় ম্যানুয়ালি ডেটাবেসটি মুছুন / আপডেট করুন, বা Database.SetInitializerকোনও IDatabaseInitializerউদাহরণ দিয়ে কল করুন " "

এখানে কী চলছে এবং এটি সম্পর্কে কী করা উচিত তা এখানে:

যখন কোনও মডেলটি প্রথম তৈরি করা হয়, আমরা ডেটাবেস তৈরি করার মতো কোনও ডেটাবেস তৈরি করতে বা বীজের ডেটা যুক্ত করার মতো কাজ করতে একটি ডেটাবেসআইনিটিয়ালাইজার চালাই run ডিফল্ট ডেটাবেসআইনিটিয়ালাইজার একটি ডাটাবেস দিয়ে তৈরি করা এডমিটাডাটা টেবিলটিতে সঞ্চিত স্কিমাটির একটি হ্যাশ দিয়ে মডেলটি ব্যবহার করার জন্য প্রয়োজনীয় ডাটাবেস স্কিমাকে তুলনা করার চেষ্টা করে (যখন কোড প্রথমটি ডাটাবেস তৈরির ক্ষেত্রে হয়)। বিদ্যমান ডাটাবেসগুলিতে এডমিটাডেটা টেবিল থাকবে না এবং তাই হ্যাশ থাকবে না… এবং আজ সেই টেবিলটি অনুপস্থিত থাকলে বাস্তবায়নটি ছোঁড়াবে। আমরা ফিয়াল সংস্করণটি পূর্বনির্ধারিত হওয়ার আগে চালানোর আগে আমরা এই আচরণটি পরিবর্তন করতে কাজ করব। ততক্ষণে, বিদ্যমান ডাটাবেসগুলিতে সাধারণত কোনও ডাটাবেস ইনিশিয়ালাইজারের প্রয়োজন হয় না তাই এটি কল করে আপনার প্রসঙ্গের ধরণের জন্য বন্ধ করা যেতে পারে:

Database.SetInitializer<YourDbContext>(null);

জেফ


9
আমি আজ এটি চেষ্টা করেছি এবং আমি আর "মডেল বদলেছি", তার পরিবর্তে আমি "অবৈধ বস্তুর নাম 'ডিবিও টেবিল" পেয়েছি
স্টিফান

3
জেফ চেয়েছিলেন এটি একটি কার্যকরী হোক তবে এটি দুই বছরের বেশি সময় পেরিয়ে গেছে এবং সেট ইনিটিয়ালাইজারটি বাতিল করতে এখনও প্রয়োজনীয়। ঠিক আছে? সুতরাং কেউ দয়া করে ব্যাখ্যা করতে পারেন যে এটি কীভাবে মাইগ্রেশন ওয়ার্কফ্লোতে ফিট করে।
ক্রুজ 23'14

2
@ জেকেজগোর্ডন: আমিও ইএফ 6 এর সাথে তবে এটি যদি গ্লোবাল.অ্যাক্সে থাকে তবে ওয়েবসাইটটি চালানোর সময় সমস্যাটি কেবল সমাধান করে। যদি আপনার ইউনিট পরীক্ষা হয় তবে আপনি OOL। এটি আপনার ডিডি কনটেক্সট এর কনস্ট্রাক্টরে রাখাই ভাল। এটি ওয়েবসাইট এবং পরীক্ষার প্রকল্পগুলি সহ প্রতিটি প্রকল্পের জন্য এটি স্থির করে।
রেপ

1
আইএমও, এই উত্তরটি উচ্চতর হওয়া উচিত কারণ এটি আমাদের কোডের এই লাইনটি যুক্ত করার প্রয়োজন কেন তা বাস্তবে ব্যাখ্যা করে । ধন্যবাদ.
পল

1
@ স্টেফানবার্গফেল্ড যদি আপনি বা কেউ Invalid object name 'dbo.Tableআপনার সংযোগের স্ট্রিং চেক পরীক্ষা করে নেন DbFilename এবং প্রাথমিক ক্যাটালগ
বেনসকাবিয়া

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

হ্যাঁ, ম্যাট ফ্রেয়ার সঠিক। আপডেট-এডিডিট: ক্যাভেটটি হ'ল আমি অন্যদের সাথে একমত হই যে এই কোডটি গ্লোবাল.এএসএক্সে যুক্ত করার পরিবর্তে আপনার ডিবি কনটেক্সট ক্লাসে যুক্ত করা হয়েছে

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

অন্যরা যেমন উল্লেখ করেছে ইউনিট পরীক্ষা পরিচালনা করার জন্যও এটি ভাল।

বর্তমানে আমি এটিটি ফ্রেমওয়ার্ক 6.1.3 /.net 4.6.1 এর সাথে এটি ব্যবহার করছি

অদূর ভবিষ্যতে আমি একটি কোরি স্নিপেট সরবরাহ করতে ফিরে আসব।


1
ধন্যবাদ! Program.cs অবশ্যই কনসোলগুলির জন্য কাজ করে।
হকিজে

তবে আপনি যখন প্রথমবার আপনার ডাটাবেসটি আরম্ভ করবেন তখন আমি onModelCreating পদ্ধতিতে setinitializer নাল রাখলে এটি ডাটাবেস তৈরি করে না। কোন চিন্তা ? ইভেন্টহুগ আমি করি (var প্রসঙ্গ = অ্যাক্টিভেটর C }
রূপেশ কুমার তিওয়ারি

আমার কোডটি খুঁজে বের করা দরকার যা আমি ব্যবহার করতাম যে আমি মাঝে মাঝে একটি লাইন দিয়ে মন্তব্য করতাম এবং অদলবদল করতাম ... সমস্যাটি আমি মনে করি না, আমার নজর দেওয়া দরকার।
টম স্টিকেল 4'15

1
সবচেয়ে ভালো সমাধান. এটি আমার সমাধানটি চালিত করার কারণ হয়ে দাঁড়ায়, এবং কী কী পদক্ষেপগুলি তা আমার কোনও ধারণা নেই। প্রতিশ্রুতিবদ্ধ এবং মোতায়েন।
Svend

32

এসকিউএল সার্ভার ম্যানেজমেন্ট স্টুডিওতে কেবল অনুসরণকারী এসকিএল কমান্ডটি চালান:

delete FROM [dbo].[__MigrationHistory]

1
তুমি আমার জীবন বাঁচিয়েছ! ধন্যবাদ.
মারেক দোর্দা

31

এই ফিক্সটি আর সিটিপি 5 এর পরে আর কাজ করে না।

তোমাকে করতে হবে Database.SetInitializer<YourContext>(null);


1
এটি কোথায় যায় ... অনমোডেল ক্রিয়েটিংয়ের ডিবিডাটাবেস নামে অ্যাক্সেসযোগ্য কিছুই নেই
জেমস রেটেগুয়ে

কোথাও শুরু করার সময়, আমি আমার অ্যাপ্লিকেশন_স্টার্টে সেট করি।
খ্রিস্টম্যান

ডাটাবেস.সেটআইনিটিয়ালাইজার EF 4.3 চূড়ান্ত প্রকাশে দুর্দান্ত কাজ করছে বলে মনে হচ্ছে।
রিচার্ড বিয়ার

আমি ধরে নিয়েছি যে "এই ফিক্সটি আর সিটিপি 5 এর পরে আর কাজ করে না" এর অর্থ 30 আগস্ট 2010-এর গৃহীত উত্তরটি সে যা বলছে।
টম স্টিকেল

19

সবেমাত্র উত্তর এবং আপডেট করার চিন্তাভাবনা খুঁজে পেয়েছি। শুধু নিম্নলিখিত করা প্রয়োজন।

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

12
ইএফ-র পরবর্তী সংস্করণগুলির দ্বারা এটি আর সম্ভব modelBuilder.Conventions.Remove<IncludeMetadataConvention>();নয়, পরিস্থিতিটিকেও সহায়তা করে না। DbDatabase.SetInitialzer (নাল); কাজ করে
জেটিউ

@ টমস্টিকেল - আমি সম্মত উত্তর হিসাবে স্ট্যাকওভারফ্লো . com/a/6143116/255562 চিহ্নিত হয়েছে ।
আশীষ গুপ্ত

16

অথবা আপনি এই লাইনটি আপনার গ্লোবাল.এক্সএক্স.সি ফাইলগুলিতে অ্যাপ্লিকেশন_সার্ট () এর অধীনে রাখতে পারেন:

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

আপনার নাম স্থান এবং প্রসঙ্গে প্রজেক্টনাম.পথ.সূত্র পরিবর্তন করার বিষয়টি নিশ্চিত করুন। যদি কোডটি প্রথমে ব্যবহার করা হয় তবে এটি যখনই স্কিমাতে কোনও পরিবর্তন আনা হবে তখনই এটি একটি নতুন ডাটাবেস মুছবে এবং তৈরি করবে।


আমার ঠিক কী দরকার ছিল, যেহেতু আমি কেবল প্রোটোটাইপিং করছিলাম। অনেক ধন্যবাদ.
শিখুন

8

আমি এই সমস্যাটি সমাধান করতে অনেক দিন ব্যয় করেছি, অনেকগুলি বিভিন্ন পোস্ট বিশ্লেষণ করেছি এবং অনেকগুলি বিকল্প চেষ্টা করেছি এবং শেষ পর্যন্ত স্থির করেছি। ইএফ কোডটি প্রথম মাইগ্রেশন ব্যবহার করে আমার সমাধানে এই 2 টি প্রকল্প:

  • কনসোল অ্যাপ্লিকেশন "ডাটামোডেল" যা মূলত এসেম্বলি হিসাবে ব্যবহার করে যা আমার সমস্ত কোডের প্রথম সত্ত্বা, ডিবি কনটেক্সট, মিরগেশন এবং জেনেরিক সংগ্রহস্থল ধারণ করে। প্যাকেজ ম্যানেজার কনসোল থেকে মাইগ্রেশন উত্পন্ন করতে আমি এই প্রকল্পে পৃথক খালি স্থানীয় ডাটাবেস ফাইল (ডেটামোডেল / অ্যাপ_ডাটা ফোল্ডারে) অন্তর্ভুক্ত করেছি।
  • WebApi, যা ডেটা মডেল প্রকল্পের উল্লেখ করে এবং WebApi / App_Data ফোল্ডার থেকে স্থানীয় ডাটাবেস ফাইল ব্যবহার করে, যা প্রকল্পে অন্তর্ভুক্ত নয়

ওয়েবএপি-র অনুরোধ করার সময় আমি এই ত্রুটিটি পেয়েছি ...

আমার পরিবেশ:

  • উইন্ডোজ 8.1 x64
  • আপডেট 1 সহ ভিজ্যুয়াল স্টুডিও 2015 পেশাদার
  • আমার সমস্ত প্রকল্পগুলি নেট নেট ফ্রেমওয়ার্ক 4.6.1 এর জন্য লক্ষ্যযুক্ত
  • নিউগেট থেকে সত্ত্বা ফ্রেমওয়ার্ক 6.1.3

এখানে আমি উল্লেখ করা ব্যতিক্রম এড়াতে আপনার মনোযোগ দেওয়া উচিত সমস্ত মন্তব্য এবং সমস্ত শর্তাদি / প্রয়োজনীয়তাগুলি পূরণ করতে হবে তা সংগ্রহ করেছি:

  1. আপনার সমাধানের সমস্ত প্রকল্পের জন্য আপনার কেবলমাত্র একক সংস্করণ ন্যুগেট প্যাকেজটি ব্যবহার করা উচিত।
  2. ডাটাবেস, ক্রমক্রমে চালিত দ্বারা তৈরি সমস্ত মাইগ্রেশন স্ক্রিপ্টগুলির একই কাঠামো / স্কিমা থাকা উচিত যেমন আপনি ডাটাবেসকে লক্ষ্য করেন এবং সত্তা মডেলের সাথে মিল রাখেন। 3 টি জিনিস অনুসরণ করে অবশ্যই একে অপরের সাথে সামঞ্জস্য / প্রতিফলন / মেলে:
    • আপনার সমস্ত মাইগ্রেশন স্ক্রিপ্ট শেষ পর্যন্ত
    • বর্তমান কোড প্রথম সত্তা মডেল রাজ্য (DbContext, সত্তা)
    • লক্ষ্য ডাটাবেস
  3. টার্গেট ডাটাবেস (এমডিএফ ফাইল) সর্বশেষ মাইগ্রেশন স্ক্রিপ্টের সাথে আপডেট / সামঞ্জস্য করা উচিত। আপনার টার্গেট ডাটাবেসের "__MigrationHistory" টেবিলটিতে আপনার কাছে থাকা সমস্ত মাইগ্রেশন স্ক্রিপ্টগুলির রেকর্ড রয়েছে তা যাচাই করে নিন, এর অর্থ হ'ল সমস্ত মাইগ্রেশন স্ক্রিপ্টগুলি সেই ডাটাবেসে সফলভাবে প্রয়োগ করা হয়েছিল। আমি আপনাকে উত্সাহিত স্টুডিওটি প্রজন্মের সঠিক কোড প্রথম সত্তা এবং আপনার ডাটাবেস, প্রসঙ্গের সাথে সম্পর্কিত প্রসঙ্গের জন্য ব্যবহার করার পরামর্শ দিচ্ছি -> নতুন আইটেম যুক্ত করুন -> ADO.NET সত্তা ডেটা মডেল -> কোড প্রথম ডাটাবেস থেকে: অবশ্যই, বিকল্প হিসাবে, যদি আপনার কাছে কোনও ডাটাবেস নেই আপনি ম্যানুয়ালি মডেল (কোড প্রথম সত্ত্বা এবং প্রসঙ্গ) লিখতে পারবেন এবং তারপরে প্রাথমিক মাইগ্রেশন এবং ডাটাবেস তৈরি করতে পারবেন।
  4. সংযোগ স্ট্রিং এর নাম যেমন MyConnectionString মধ্যে কনফিগ প্রারম্ভে প্রকল্পের ফাইল (Web.config / App.config):

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

    আপনার ডিবি কনটেক্সট এর কনস্ট্রাক্টরে পাস করা প্যারামিটারের সমান হওয়া উচিত:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. প্যাকেজ ম্যানেজার কনসোল ব্যবহার করার আগে , নিশ্চিত হয়ে নিন যে আপনি আপডেটের জন্য সঠিক ডাটাবেস ব্যবহার করছেন বা মাইগ্রেশন উত্পন্ন করছেন এবং প্রয়োজনীয় প্রকল্পটি সমাধানের সূচনা প্রকল্প হিসাবে সেট করা আছে ডাটাবেসের সাথে সংযোগের জন্য এটি .config ফাইল থেকে সংযোগ স্ট্রিং ব্যবহার করবে, যা প্রকল্পে, এটি প্রারম্ভিক প্রকল্প হিসাবে সেট করা আছে।
  6. এবং মূলটি , যা আমার সমস্যাটিকে স্থির করেছে: এটি অদ্ভুত, তবে আমার ওয়েবএপি / বিন ফোল্ডারে ডেটামোডেল.এক্সই পুরানো ছিল, শেষ বিল্ডের পর থেকে তা রিফ্রেশ হয়নি। যেহেতু মাইগ্রেশনগুলি আমার সমাবেশ ডেটামোডেল.এক্সে এম্বেড করা হয়েছিল তখন আমার ওয়েবএপি পুরানো মিরর ব্যবহার করে আপডেট করা ডাটাবেস updated আমি বিভ্রান্ত হয়ে পড়েছিলাম কেন WebApi তে ডাটাবেস আপডেট করার পরে এটি ডেটামোডেল থেকে সর্বশেষ মাইগ্রেশন স্ক্রিপ্টের সাথে সামঞ্জস্য নয়। নিম্নলিখিত কোডটি স্বয়ংক্রিয়ভাবে তৈরি হয় (যদি না থাকে) বা আমার ওয়েবএপি / অ্যাপ_ডাটা ফোল্ডারে সর্বশেষ স্থানান্তর স্থানীয় ডেটাবেস আপডেট হয় updates

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

    আমি পরিষ্কার এবং পুনর্নির্মাণ সমাধানের চেষ্টা করেছি তবে এটি কোনও ফল দেয় না, আমি ওয়েবএপি থেকে বিন এবং অবজেক্ট ফোল্ডারগুলি সম্পূর্ণরূপে অপসারণের চেয়ে, ওয়েবএপি / অ্যাপ_ডাটা থেকে মুছে ফেলা ডাটাবেস ফাইলগুলি, নির্মিত, পুনরায় চালু ওয়েবএপি, অনুরোধ করেছিলাম, এটি সঠিক ডাটাবেস তৈরি করেছে - অলস সূচনা (ব্যবহার করে) উপরের লাইনগুলি), যা সর্বশেষতম স্থানান্তরের সাথে সম্পর্কিত এবং ব্যতিক্রমটি বেশি প্রদর্শিত হয়নি appear সুতরাং, এটি আপনার সমস্যার সমাধান করতে পারে:

    1. আপনার প্রারম্ভিক প্রকল্প থেকে ম্যানুয়ালি বিন, অবজেক্ট ফোল্ডারগুলি সরান (যা আপনার ডাটাবেস উত্পন্ন / আপডেট করে)
    2. আপনার প্রারম্ভিক প্রকল্পটি তৈরি করুন বা আপনার সমস্ত সমাধানটি আরও ভাল করে পরিষ্কার করুন এবং পুনর্নির্মাণ করুন।
    3. প্রকল্প শুরু করে ডাটাবেস পুনরায় তৈরি করুন (উপরে লাইনগুলি কার্যকর করা হবে) বা প্যাকেজ ম্যানেজার কনসোল "আপডেট-ডাটাবেস" কমান্ডটি ব্যবহার করুন।
    4. জেনারেটেড ডিবি এবং __মিরগেশনহিসটরি সর্বশেষ মাইগ্রেশন স্ক্রিপ্টের সাথে মিল রয়েছে কিনা তা ম্যানুয়ালি পরীক্ষা করে দেখুন।

5

আমার জন্য, ৪.৩.১-তে আপগ্রেড করার সাথে সাথে আমি কেবল এড্মেটাডেটা টেবিলটি কেটে ফেলছি বা কেবল এটি সরাসরি মুছে ফেলব।


আমি 4.3.1 এ আপডেট করেছি এবং তারপরে কেবল এডমমেটাটাটা টেবিলটির নামকরণ করেছি। আমি এখন প্রয়োজন অনুসারে মডেলটিতে পরিবর্তন করতে পারি এবং মডেলটির ব্যাক ব্লাহ ব্লাহ সম্পর্কে আর কোনও বিরক্তিকর ত্রুটি বার্তা নেই।
অশোক পদ্মনাভবন

3

VB.NET বিকাশকারীদের জন্য:

পদ্ধতির শেষে অ্যাপ্লিকেশন_সার্ট () শেষে Glabal.asax.vb ফাইলটিতে নিম্নলিখিত লাইনটি যুক্ত করুন

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

আপনার নির্দিষ্ট ডিবি প্রসঙ্গে অ্যাপ্লিকেশনডিবি কনটেক্সট পরিবর্তন করুন।


2

আমার এই সমস্যাটি ছিল এবং এটি প্রমাণিত হয়েছে যে একটি প্রকল্প এসকিউএলএক্সপ্রেসকে নির্দেশ করছে তবে সমস্যাটি এমন একটি লোকালডিবিতে নির্দেশ করছে। (তাদের নিজ নিজ ওয়েব.কমফিগে)। নির্বোধ পর্যবেক্ষণ তবে অন্য কেউ যদি এই সমস্যাটির সমাধান করছে তবে এখানে লক্ষণীয়।


2

এর অর্থ হ'ল প্রসঙ্গে কিছু পরিবর্তন হয়েছে যা কার্যকর করা হয়নি। আমাদের করা পরিবর্তনগুলি তৈরি করতে প্রথমে অ্যাড-মাইগ্রেশন চালান (পরিবর্তনগুলি যা আমরা জানি না) এবং তারপরে আপডেট-ডাটাবেস চালান


2

আমার একই সমস্যা ছিল - মাইগ্রেশনটি পুনরায় যুক্ত করা এবং ডাটাবেস আপডেট করা কার্যকর হয়নি এবং উপরের উত্তরগুলির কোনওটিই সঠিক বলে মনে হচ্ছে না। তারপরে অনুপ্রেরণা আমাকে আঘাত করেছে - আমি একাধিক স্তর (একটি ওয়েব, একটি ডেটা এবং একটি ব্যবসা) ব্যবহার করছি। ডেটা স্তরটিতে প্রসঙ্গ এবং সমস্ত মডেল রয়েছে। ওয়েব স্তরটি কখনও এই ব্যতিক্রমটিকে ছুঁড়ে মারেনি - এটি ছিল ব্যবসায়ের স্তর (যা আমি পরীক্ষার জন্য এবং ডিবাগিংয়ের জন্য কনসোল অ্যাপ্লিকেশন হিসাবে সেট করেছি)। ব্যবসায়ের স্তরটি সবিস্তারে ডিবায় পেতে এবং প্রসঙ্গটি তৈরি করতে সঠিক সংযোগের স্ট্রিংটি ব্যবহার করে না। সুতরাং আমি ব্যবসায় স্তর (এবং ডেটা স্তর) এর অ্যাপ্লিকেশন কনফিগারেশনে সংযোগের স্ট্রিং যুক্ত করেছি এবং এটি কাজ করে ভায়োলা। অন্যদের জন্য যারা এখানে একই সমস্যাটির মুখোমুখি হতে পারে তাদের এখানে রেখে দেওয়া।


1

আমি ব্যবহার করার আগে মডেল এবং ডিবি মেলে কিনা তা পরীক্ষা করার জন্য আমি ডেটাবেস.কম্পুটিউইথমোডেল পদ্ধতি (ইএফ 5 এ উপলব্ধ) ব্যবহার করি। আমি প্রসঙ্গ তৈরি করার পরে এই পদ্ধতিটি কল করি ...

        // 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 আছে এবং একই সাথে এসপ নেট পরিচয় ব্যবহার করে

সুতরাং আমার ওয়েবকনফিগটিতে আমার দুটি সংযোগসটিং রয়েছে এবং এটি নিয়ে কোনও সমস্যা নেই। এটি ঘটেছিল যে আমি স্ক্রিপ্টগুলি তৈরি করেছি / চালিত করে নিজেই তৈরি করেছিলাম এমন এসপ নেট পরিচয় টেবিল যা আমার উচিত নয়।

সুতরাং ম্যানুয়ালি / স্ক্রিপ্টগুলি থেকে আপনার দ্বারা তৈরি করা সমস্ত এসপ.net পরিচয় টেবিল প্রথমে ড্রপ করুন।

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

1

এই সমাধানগুলির কোনওটিই আমাদের পক্ষে কাজ করবে না (সম্পূর্ণরূপে স্কিমা চেকিং নিষ্ক্রিয় করা ছাড়া)। শেষ পর্যন্ত আমাদের নিউটনসফট.জসনের সংস্করণটিতে একটি মিস-ম্যাচ হয়েছিল

আমাদের অ্যাপকনফিগ সঠিকভাবে আপডেট হয় নি:

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

নিউটোনসফট.জসনের সংস্করণটি নিয়ে আমরা একটি অবিশ্বাস্য সমস্যা ছিল, যখন আমরা সংস্করণটি আপডেট করি তখন সমস্যার সমাধান হয়েছিল।
রুই এস্তেরিতো

0

এই বিষয়ে কিছু গবেষণা করার পরে, আমি খুঁজে পেয়েছি যে ত্রুটিটি মূলত যদি আপনার স্থানীয় এসকিএল সার্ভার এক্সপ্রেসে পূর্বে ডিবি তৈরির উদাহরণ থাকে occ সুতরাং যখনই আপনার ডিবি সম্পর্কিত আপডেট রয়েছে এবং ডিবি আপডেট করার চেষ্টা করুন / Update Databaseকমান্ডটি ব্যবহার না করে ডিবিতে কিছু কোড চালান Package Manager Console; প্রথমত, আপনাকে আমাদের স্থানীয় এসকিএল এক্সপ্রেসে ম্যানুয়ালি পূর্ববর্তী ডিবি মুছতে হবে।

এছাড়াও, AutomaticMigrationsEnabled = false;আপনার কনফিগারেশন না থাকলে এই সমাধানটি কাজ করে ।

আপনি যদি কোনও সংস্করণ নিয়ন্ত্রণ ব্যবস্থা (গিট, এসএনএন, ইত্যাদি) এবং অন্যান্য কিছু বিকাশকারী ডিবি অবজেক্টগুলি উত্পাদন পর্যায়ে আপডেট করেন তবে যখনই আপনি আপনার কোড বেস আপডেট করবেন এবং অ্যাপ্লিকেশনটি চালাবেন তখন এই ত্রুটিটি বেড়ে যায়।

উপরে বর্ণিত হিসাবে, কোড বেসে এর জন্য কিছু সমাধান রয়েছে। তবে এটি কিছু ক্ষেত্রে সবচেয়ে কার্যকর for


0

আমি প্রো এএসপি.নেট এমভিসি 4 বইটিও পড়ছি এবং আপনার একই সমস্যার মুখোমুখি হয়েছি। আমার জন্য, বইয়ের 'মডেল বৈধকরণ যুক্তকরণ' বিভাগে নির্ধারিত পরিবর্তনগুলি করার পরে আমি সমস্যাটি শুরু করি। আমি যেভাবে সমস্যার সমাধান করেছি তা হ'ল লোকালডিবি থেকে আমার ডেটাবেসকে পূর্ণ-বিকাশযুক্ত এসকিউএল সার্ভার 2012 সার্ভারে স্থানান্তর করা। (বিটিডাব্লু, আমি জানি যে আমি ভাগ্যবান আমি পূর্ণ-বর্ধিত সংস্করণে চলে যেতে পারি, সুতরাং আমাকে ঘৃণা করবেন না;


আপনি কীভাবে জানবেন যে এটি ডিবি-র যোগাযোগ, এবং উদাহরণস্বরূপ এর মেটাডেটা নয়?
ফ্লপ করুন

2
বিলম্বিত প্রতুত্তরের জন্য দুঃখিত। এটি একেবারেই কোনও যোগাযোগের সমস্যা নয়! ডিবি পুনরুদ্ধার করা মাত্র সমস্যার মুখোশ পেলাম, কারণ আমি আবার একই সমস্যা পেয়েছি! একটি __Migrationxxx (টেবিলের সঠিক নামটি স্মরণ করতে পারে না কারণ আমি এটি সরিয়ে দিয়েছি) ইএফ দ্বারা তৈরি করা হয়েছে। কেবল এটি মুছুন এবং আপনার ভাল হওয়া উচিত।
জে স্পেসস

@ মাইজে 3 সমস্ত লোক এই সমস্ত ফ্রিগিন লাইন এবং কোডের লাইনগুলিকে স্পাউট করছে। এই সব আমার দরকার! একটি উত্তর হতে হবে (ptionচ্ছিক পরিস্থিতি)।
টেরেন্স 100

@ টেরেন্স 100 ধন্যবাদ!
J3Speaks

0

নিম্নলিখিত পদক্ষেপগুলি পরীক্ষা করে দেখুন

  1. Database.SetInitializer (নাল); -> Global.asax.cs এ .c

2।

  1. আপনার প্রসঙ্গ শ্রেণীর নামটি এটির সাথে মিলিত হওয়া উচিত

0

এর সাথে ইভেন্ট Global.asax.csসহ সংশোধন করুন Application_Start:

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

5
ব্যক্তিগতভাবে ব্যক্তিগতভাবে এটি কী করে তা সম্পর্কে আমি কিছুটা পরিষ্কার হতে চাই।
কেসি

3
না না না, আমি ড্রপক্রিয়েট ডেটাবেসআইফমোডেল 99% সময় পরিবর্তন করতে চাই না!
টম স্টিকেল

0

এই ত্রুটিটি আপনার সংযোগের স্ট্রিং এবং আপনার সংযোগের স্ট্রিংয়ের নাম ডেটাবেস প্রসঙ্গ ঘোষণার সাথে মেলে কিনা তা ইঙ্গিত করতে পারে।

আমার এই ত্রুটি হয়েছিল কারণ আমি স্থানীয় ডাটাবেসটিকে ভুলভাবে (নিরীহ ভুল) নাম দিয়েছি এবং "ডিফল্ট সংযোগ" এর ওয়েবকনফাইগের সংযোগের স্ট্রিংয়ের নামটি মাইডিবি কনটেক্সট এর সাথে মেলে না ie

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


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

0

System.Data.Entity ব্যবহার করে যা ডাটাবেস সেটInitializer ব্যবহার করার চেষ্টা করুন;

Global.asax এ

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

এটি আপনার মডেলটি পরিবর্তিত হওয়ার সাথে সাথে নতুন ডেটাবেস তৈরি করবে your তবে আপনার ডাটাবেসটি খালি থাকবে it এটি ডামি ডেটা পূরণ করার জন্য আপনি বীজ বপন ব্যবহার করতে পারেন। যা আপনি এই হিসাবে প্রয়োগ করতে পারেন:

বপন ::

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

মাইডিবিআইনিটিয়ালাইজারফোর্ড টেস্টিং কেবলমাত্র ড্রপক্রিয়েট ডেটাবেসএলও থেকে উত্তরাধিকার সূত্রে প্রাপ্ত যাতে কিছু নির্দিষ্ট ক্ষেত্রে (পরীক্ষার) ক্ষেত্রে পুরো ডাটাবেসটি পুনর্নির্মাণ করা হয়। অন্যথায় এটি সর্বশেষ সংস্করণে স্থানান্তরিত হয়েছে।

আমার উত্স: https://msdn.microsoft.com/en-us/data/jj591621.aspx# স্পেসিফিক


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);
        }
    }       
}

নোট করুন যে মাইগ্রেশনস. কনফিগারেশন প্যাকেজ ম্যানেজার কনসোলে মাইগ্রেশন কমান্ড লাইন দ্বারা উত্পাদিত একটি শ্রেণি। আপনার Migration.Configration ক্লাসের সর্বজনীন পরিবর্তককে অভ্যন্তরীণ পরিবর্তনের দরকার হতে পারে।

এবং এটি আপনার ওমমডেল ক্রিয়েটিং থেকে নিবন্ধ করুন:

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) মাইক্রোসফ্ট ব্যবহার করে নেমস্পেস যুক্ত করুন spএএসপনেট.আইডেন্টিটি.এন্টি ফ্রেমওয়ার্ক;

3) পাবলিক মাইডিবিকনটেক্সট (): বেস ("নাম = মাইডিবি কনটেক্সট") {ডাটাবেস.সেটইনিটিয়ালাইজার (নতুন ড্রপক্রিয়েট ডেটাবেসএলওয়েজ ()); }

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.