Veritabanı oluşturulduğundan beri <Veritabanı> bağlamını destekleyen model değişti


253

Hata mesajı:

"Veritabanı oluşturulduğundan beri 'AddressBook' bağlamını destekleyen model değişti. Ya veritabanını el ile silin / güncelleyin ya da IDatabaseInitializer örneğiyle Database.SetInitializer'ı çağırın. Örneğin, RecreateDatabaseIfModelChanges stratejisi veritabanını otomatik olarak siler ve yeniden oluşturur ve isteğe bağlı olarak yeni verilerle ekilebilir. "

İlk kod özelliğini kullanmaya çalışıyorum ve aşağıdaki yazdım:

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

Bağlam sınıfı:

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

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

ve bağlantı dizesi:

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

Yani, veritabanı adı "AddressBook" ve kişi nesnesini bağlama eklemek için çalışırken hata oluşur. Burada bir şey eksik mi?



Veritabanınızdan __MigrationHistory tablosunu kaldırın
Zahid Hasan

Yanıtlar:


397

Şimdi o:

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

YourDbContext.cs dosyanızda.


Üretimimi db'yi manuel olarak değiştirdim ve geçişi kapattım ve işe yarıyor, Teşekkürler
Mohsen Afshin

13
Ps, bu Global.asax'a gider Application_Start ()
BritishDeveloper

48
Global.asax daha iyi bu DbContext sınıfınızın yapıcı koymaktır. Bu şekilde, yalnızca Global.asax dosyası tarafından denetlenen tek bir site yerine bağlamı kullanarak her site için çalışır.
Corin

7
Bağlam sınıfının statik yapıcısına koymak için muhtemelen en iyisi, bu yüzden sadece bir kez çağrılır - bu örnek videodaki gibi: msdn.microsoft.com/en-us/data/jj572367
Christian Fredh

3
OnModelCreating (DbModelBuilder modelBuilder) {Database.SetInitializer <YourDbContext> (null) korumalı geçersiz kılma içine yerleştirilmelidir. base.OnModelCreating (ModelBuilder); }
Chris Voon

135

Jeff Gu'nun Jeff tarafından yayınlanan gerçekte neler olduğuna dair bazı bilgileri aşağıda bulabilirsiniz :

Bu istisnayı görenler için:

"'Üretim' bağlamını destekleyen model veritabanı oluşturulduğundan beri değişti. Ya veritabanını el ile silin / güncelleyin ya Database.SetInitializerda bir IDatabaseInitializerörnekle çağırın ."

İşte neler oluyor ve bu konuda ne yapmalı:

Bir model ilk oluşturulduğunda, orada değilse veritabanı oluşturmak veya tohum verileri eklemek gibi şeyler yapmak için bir DatabaseInitializer çalıştırırız. Varsayılan DatabaseInitializer, modeli kullanmak için gereken veritabanı şemasını bir veritabanı ile oluşturulan bir EdmMetadata tablosunda saklanan şema karmasıyla karşılaştırmaya çalışır (Code First, veritabanını oluşturan koddur). Mevcut veritabanları EdmMetadata tablosuna sahip olmayacak ve bu nedenle karma olmayacak… ve bu tablo eksikse bugün uygulama atılacak. Varsayılan olduğu için fial sürümünü göndermeden önce bu davranışı değiştirmeye çalışacağız. O zamana kadar, varolan veritabanlarının genellikle herhangi bir veritabanı başlatıcısına ihtiyacı yoktur, böylece içerik türünüz için şu şekilde çağrılarak kapatılabilir:

Database.SetInitializer<YourDbContext>(null);

Jeff


9
Bugün bunu denedim ve artık "Model değişti" almıyorum, bunun yerine "Geçersiz nesne adı 'dbo.Table'" alıyorum
Stefan Bergfeldt

3
Jeff bunun bir geçici çözüm olmasını istedi, ancak iki yıldan uzun bir süre geçti ve SetInitializer'ın null olması gerekiyor. sağ? Birisi bunun taşıma iş akışına nasıl uyduğunu açıklayabilir mi?
kroiz

2
@jakejgordon: Ben de EF6 ile birlikte, ancak Global.asax'daysa, yalnızca web sitesini çalıştırırken sorunu giderir. Birim testleriniz varsa, OOL'sunuz. YourDbContext yapıcısına koymak daha iyi. Bu, web sitesi ve test projeleri de dahil olmak üzere her proje için düzeltildi.
Rap

1
IMO, bu kod satırını neden eklememiz gerektiğini açıkladığından bu yanıt daha yüksek puanlanmalıdır . Teşekkür ederim.
Paul

1
@StefanBergfeldt sizin ya da bir başkasının Invalid object name 'dbo.Tablebağlantı dizesini kontrol ederseniz attachDbFilename ve ilk katalog
benscabbia

41

İçin 6.1.3'e - Varlık Framework 5.0.0.0

Sen DO gerçekten aşağıdakileri yapmak istiyorum:

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

Evet, Matt Frear doğru. UPDATE -EDIT: Dikkat, bu kodu DbContext sınıfınıza eklenen global.asax'a eklemek yerine başkalarıyla aynı fikirdeyim

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

Diğerlerinin de belirttiği gibi, bu birim testini yapmak için de iyidir.

Şu anda Entity Framework 6.1.3 /.net 4.6.1 ile kullanıyorum

Yakın gelecekte bir CORE snippet'i sağlamak için geri geleceğim.


1
Teşekkür ederim! Program.cs kesinlikle konsollar için çalışır.
HokeyJ

Ancak veritabanınızı ilk kez başlattığınızda, onModelCreating yönteminde setinitializer null değerini koyarsam veritabanı oluşturmaz. Düşüncesi olan var mı ? Eventhoug i (var context = Activator.CreateInstance <TContext> ()) {context.Database.Initialize (true); }
Rupesh Kumar Tiwari

Ben bazen bir satır yorum ve takas olurdu kullanacağım benim kod bulmak gerekir ... Ben sorunu el hatırlamak yok, bakmam gerekiyor.
Tom Stickel

1
En iyi çözüm. Çözümümün çalışmasına neden oluyor ve sonuçların ne olduğu hakkında hiçbir fikrim yok. Taahhüt edin ve konuşlandırın.
Svend

32

SQL Server Management Studio'da aşağıdaki sql komutunu çalıştırmanız yeterlidir:

delete FROM [dbo].[__MigrationHistory]

1
Hayatımı kurtardın! Teşekkür ederim.
Marek Dorda

31

Bu düzeltme artık CTP5'ten sonra çalışmıyor.

Yapmak zorundasın Database.SetInitializer<YourContext>(null);


1
Nereye gidiyor ... OnModelCreating'in DbDatabase
James Reategui

Başlangıçta bir yerde, Application_Start'da benimkini ayarladım.
chrisortman

Database.SetInitializer, EF 4.3 son sürümünde iyi çalışıyor gibi görünüyor.
Richard Beier

"Bu düzeltmenin artık CTP5'ten sonra çalışmadığını" 30 Ağustos 2010'dan itibaren Kabul edilen yanıtın söylediği anlamına geldiğini varsayıyorum.
Tom Stickel

19

Sadece cevabı öğrendim ve burada güncelleme yapmayı düşündüm. Sadece aşağıdakileri yapmanız gerekir.

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

12
Bu, EF'in sonraki sürümlerinde artık mümkün modelBuilder.Conventions.Remove<IncludeMetadataConvention>();değil , aynı zamanda duruma da yardımcı olmuyor. DbDatabase.SetInitialzer (boş); çalışır.
JTew

@TomStickel - Kabul ediyorum. Yanıt olarak stackoverflow.com/a/6143116/255562 olarak işaretlendi .
Ashish Gupta

16

Veya bu satırı Application_Start () altındaki Global.asax.cs dosyanıza koyabilirsiniz:

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

ProjectName.Path.Context'i ad alanınıza ve içeriğinize değiştirdiğinizden emin olun. Önce kod kullanılırsa, şemada her değişiklik yapıldığında yeni bir veritabanı silinecek ve oluşturulacaktır.


Tam olarak ihtiyacım olan şey, çünkü sadece prototip yapıyordum. Çok teşekkürler.
Öğrenci

8

Bu sorunu çözmek için çok gün geçirdim, birçok farklı yayını analiz ettim ve birçok seçeneği denedim ve sonunda düzelttim. Bu 2 çözümümde EF kodu ilk geçişlerini kullanarak projeksiyon:

  • Konsol Uygulaması "DataModel" temel olarak tüm kod ilk varlıkları, DbContext, Mirgations ve genel depo içeren montaj olarak kullanmak. Paket Yöneticisi Konsolu'ndan geçişler oluşturmak için bu projeye ayrı boş yerel veritabanı dosyası (DataModel / App_Data klasöründe) dahil ettim.
  • DataModel projesine başvuran ve WebApi / App_Data klasöründeki yerel veritabanı dosyasını kullanan ve projeye dahil olmayan WebApi

WebApi istendiğinde bu hatayı aldım ...

Çevrem:

  • Windows 8.1 x64
  • Güncelleştirme 1 ile Visual Studio 2015 Professional
  • .NET Framework 4.6.1'i hedefleyen tüm projelerim
  • NuGet'ten EntityFramework 6.1.3

Burada, dikkat etmeniz gereken tüm yorumları ve belirtilen istisnadan kaçınmak için karşılanması gereken tüm koşulları / gereksinimleri topladım:

  1. Çözümünüzdeki tüm projeler için EntityFramework Nuget paketinin yalnızca bir sürümünü kullanmalısınız.
  2. Tüm geçiş komut dosyalarının sırayla çalıştırılmasıyla oluşturulan veritabanı, veritabanını hedeflediğiniz ve varlık modeline karşılık gelen yapı / şema ile aynı olmalıdır. Aşağıdaki 3 şey tam olarak birbirine uymalı / yansıtmalı / eşleştirilmelidir:
    • Sonuna kadar tüm taşıma komut dosyanız
    • Geçerli kod ilk varlık modeli durumu (DbContext, varlık)
    • Hedef veritabanı
  3. Hedef veritabanı (mdf dosyası) güncellenmeli / en son taşıma komut dosyasına karşılık gelmelidir. Hedef veritabanınızdaki "__MigrationHistory" tablosunun sahip olduğunuz tüm taşıma komut dosyalarının kayıtlarını içerdiğini doğrulayın; bu, tüm taşıma komut dosyalarının bu veritabanına başarıyla uygulandığı anlamına gelir. Visual Studio, veritabanınıza karşılık gelen nesil doğru kod ilk varlıkları ve bağlam için kullanmanızı öneririm, Proje -> Yeni Öğe Ekle -> ADO.NET Varlık Veri Modeli -> Kod İlk veritabanından: Tabii ki, alternatif olarak, eğer el ile model yazamayacağınız bir veritabanı (ilk varlık ve bağlam kodu) ve sonra ilk geçiş ve veritabanı oluşturabilirsiniz.
  4. Bağlantı projesinin adı, örneğin başlangıç ​​projesinin yapılandırma dosyasındaki MyConnectionString (Web.config / App.config):

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

    DbContext öğenizin yapıcısında iletilen parametreye eşit olmalıdır:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
  5. Paket Yöneticisi Konsolu'nu kullanmadan önce , güncelleme veya taşıma oluşturmak için doğru veritabanını kullandığınızdan ve gerekli proje çözümün başlangıç ​​projesi olarak ayarlandığından emin olun . Veritabanına bağlanmak için, projede başlangıç ​​projesi olarak ayarlanan bu .config dosyasından bağlantı dizesi kullanır.
  6. Ve benim sorun giderilen ana: Garip, ama benim WebApi / bin klasöründe DataModel.exe eski, son derleme beri yenilenmiş değil. Geçişler benim montaj DataModel.exe gömülü olduğundan, benim WebApi benim veritabanı eski mirgations kullanarak güncellendi. Neden WebApi veritabanını güncelledikten sonra DataModel en son taşıma komut dosyası karşılık gelmez karıştı. Aşağıdaki kod otomatik olarak WebApi / App_Data klasörümdeki en son geçiş yerel veritabanını oluşturur (yoksa) veya güncelleştirir.

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

    Temizlemeyi ve yeniden oluşturmayı denedim ama yardımcı olmadı, bin ve obj klasörlerini WebApi'den tamamen kaldırdım, WebApi / App_Data'daki veritabanı dosyalarını sildim, yerleşik, yeniden başlatılan WebApi, istekte bulundum, doğru veritabanı oluşturdular - tembel başlatma (kullanarak yukarıdaki satırlar), en son taşıma ve istisnaya karşılık gelen daha fazla görünmüyordu. Yani, bu sorununuzu çözebilir:

    1. manuel olarak bin, obj klasörlerini başlangıç ​​projenizden kaldırın (veritabanınızı oluşturur / günceller)
    2. başlangıç ​​projenizi oluşturun veya tüm çözümlerinizi daha iyi temizleyin ve yeniden oluşturun.
    3. projeyi başlatarak (yukarıdaki satırları çalıştıracak) veritabanını yeniden oluşturun veya Package Manager Console "update-database" komutunu kullanın.
    4. oluşturulan db ve __MirgationHistory öğelerinin en son geçiş komut dosyasına karşılık gelip gelmediğini manuel olarak kontrol edin.

5

Benim için, 4.3.1'e yükseltme ile, sadece EdmMetaData tablosunu kısaltır ya da sadece silebilirim.


4.3.1'e güncellendi ve sonra sadece EdmMaetaData tablosunu yeniden adlandırdım. Şimdi modele gerektiği gibi değişiklikler yapabilirim ve model desteğiyle ilgili daha fazla can sıkıcı hata mesajı veremem.
Ashok Padmanabhan

3

VB.NET geliştiricileri için:

Aşağıdaki satırı Application_Start () yönteminin sonunda Glabal.asax.vb dosyasına ekleyin

Database.SetInitializer(Of ApplicationDbContext)(Nothing)

ApplicationDbContext öğesini özel Db içeriğinizle değiştirin.


2

Bu sorunu vardı ve bir proje SQLExpress işaret ediyordu ama sorun olan biri LocalDb işaret ediyordu. (ilgili web.config dosyalarında). Aptal gözetim ama başka birinin bu sorunu gidermesi durumunda burada belirtmeye değer.


2

Bu, bağlamda yürütülmemiş bazı değişiklikler olduğu anlamına gelir. Lütfen yaptığımız değişiklikleri (farkında olmadığımız değişiklikleri) oluşturmak için önce Add-Migration'ı çalıştırın ve ardından Update-Database'i çalıştırın


2

Aynı sorunu vardı - geçiş yeniden ekleme ve veritabanını güncelleştirme işe yaramadı ve yukarıdaki cevapların hiçbiri doğru görünmüyordu. Sonra ilham beni vurdu - Birden fazla katman (bir web, bir veri ve bir iş) kullanıyorum. Veri katmanı bağlama ve tüm modellere sahiptir. Web katmanı hiçbir zaman bu istisnayı atmadı - iş katmanıydı (test ve hata ayıklama için konsol uygulaması olarak ayarladığım). İş katmanı db almak ve bağlam yapmak için doğru bağlantı dizesini kullanmadığı ortaya çıkıyor. Bu yüzden iş katmanının (ve veri katmanının) uygulama yapılandırmasına bağlantı dizesini ekledim ve çalışıyor. Bunu aynı sorunla karşılaşabilecek başkaları için buraya koymak.


1

Ben kullanmadan önce model ve DB eşleşip eşleşmediğini sınamak için Database.CompatibleWithModel yöntemini (EF5'te kullanılabilir) kullanıyorum. Bu yöntemi bağlamı oluşturduktan hemen sonra çağırıyorum ...

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

İyi bir öneri, ancak, her durumda nt çok doğru. Ben bir tane buluyorum. Lütfen Visual Studio'da PM pencerelerini kullanarak "enable-migrations" komutunu çalıştırdığınızdan emin olmanız gerekir; bu durumda Migration klasörü projenize eklenir.

Klasöre eklenen iki c # sınıfı dosyanın tüm modellerinizi ve ilgili özelliklerini içerdiğinden emin olun.

Eğer tüm bu çözümü kurmak ve dağıtım için publis varsa.

Buradaki mantık, uygulamanızda geçerli olanın yerini alacak meta veriler olmadığı için mevcut meta verilerin üzerine yazılamamasıdır. Sonuç olarak, "Veritabanı oluşturulduğundan bu yana içeriği destekleyen model değişti" hatası alıyorsunuz


1

Birisinin benimkiyle aynı senaryoya sahip olması durumunda.

Ben ilk EF veritabanım var ve aynı zamanda asp.net kimliğini kullanarak

Bu yüzden webconfig dosyamda iki connectionStrings var ve bununla ilgili bir sorun yok. Ben asp.net kimlik tabloları oluşturmak için el ile değil komut dosyaları oluşturmak / çalıştırmak oldu oldu.

DROP önce elle / komut dosyalarından sizin tarafınızdan oluşturulan tüm asp.net kimlik tablolarını DROP yapın.

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

1

Bu çözümlerin hiçbiri bizim için işe yaramaz (şema kontrolünü tamamen devre dışı bırakmak dışında). Sonunda Newtonsoft.json versiyonumuzda bir maçımız vardı

AppConfig uygulamamız doğru şekilde güncellenmedi:

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

Çözüm, montaj sürümünü aslında dağıttığımız sürümle düzeltmekti

<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 sürümü ile benzer bir sorun yaşadık, sürümü güncellediğimizde sorun çözüldü.
Rui Estreito

0

Bu konuda biraz araştırma yaptıktan sonra, daha önce yerel sql server express üzerinde oluşturulan bir db örneği varsa hatanın temelde oluştuğunu buldum. Eğer db güncellemeleri var ve Update Databasekomut kullanarak çalıştırmadan db / db üzerinde bazı kod çalıştırmak deneyin Yani Package Manager Console; her şeyden önce, yerel sql express üzerinde önceki db el ile silmek zorunda.

Ayrıca, bu çözüm AutomaticMigrationsEnabled = false;Yapılandırmanızda yoksa çalışır .

Bir sürüm kontrol sistemi (git, svn, vb.) İle çalışıyorsanız ve bazı diğer geliştiriciler db nesnelerini üretim aşamasında güncellerse, kod tabanınızı güncellediğinizde ve uygulamayı çalıştırdığınızda bu hata artar.

Yukarıda belirtildiği gibi, bunun kod bazında bazı çözümleri vardır. Bununla birlikte, bu bazı durumlar için en pratik olanıdır.


0

Pro ASP.NET MVC 4 kitabını da okuyorum ve yaşadığınız aynı problemle karşılaştım. Benim için, kitabın 'Model Doğrulama Ekleme' bölümünde belirtilen değişiklikleri yaptıktan sonra sorunu yaşamaya başladım. Sorunu çözmenin yolu, veritabanımı localdb'den tam gelişmiş SQL Server 2012 sunucusuna taşımaktır. (BTW, tam gelişmiş sürüme geçebildiğim için şanslı olduğumu biliyorum, bu yüzden benden nefret etmeyin. ;-))) Soruna neden olan db ile iletişimde bir şey olmalı.


Bunun meta verileri değil, db ile iletişim olduğunu nasıl anlarsınız?
Ocak'ta flup

2
Geç cevap için özür dilerim. Bu onun bir iletişim sorunu olmadığı ortaya çıkıyor! Db yeniden oluşturmak sadece sorunu maskeledi, çünkü ben yine aynı sorunu var! Bir __Migrationxxx (sadece kaldırdım çünkü tablonun tam adını hatırlayamıyorum) ef tarafından oluşturulur. Sadece silin ve hepiniz iyi olmalısınız.
J3Speaks

@ MyJ3 Bütün bu friggin satırlarını ve kod satırlarını tüm insanlar tükürüyor. Tüm ihtiyacım olan bu! Cevap olmayı hak ediyor (İsteğe Bağlı Senaryo).
Terrance00

@ Terrance00 Teşekkürler!
J3Speaks

0

Aşağıdaki adımları kontrol edin

  1. Database.SetInitializer (boş); -> Global.asax.cs içinde

2.

  1. Bağlam sınıfı adınız kontrol ile eşleşmelidir

0

Değiştir Global.asax.csdahil Application_Startolan olay:

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

5
Kişisel olarak bunun ne yaptığı hakkında biraz daha net olurdum.
Casey

3
HAYIR HAYIR HAYIR, DropCreateDatabaseIfModelChanges% 99'unu kullanmak istemiyorum!
Tom Stickel

0

Bu hata, bağlantı dizenizle ilgili bir sorunu ve bağlantı dizesi adınızın Veritabanı bağlamı bildirimiyle eşleşip eşleşmediğini gösterebilir.

Yerel veritabanı yanlış (aptalca hata) adını ve "DefaultConnection" web.config bağlantı dizesinin adı MyDbContext yani eşleşmedi çünkü bu hatayı vardı

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


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

0

System.Data.Entity kullanımına ait Database SetInitializer'ı kullanmayı deneyin;

Global.asax'ta

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

Bu, modeliniz her değiştiğinde yeni bir veritabanı oluşturacaktır.Ancak veritabanınız boş olacaktır.Kukla verilerle doldurmak için Seeding kullanabilirsiniz. Hangi olarak uygulayabilirsiniz:

Tohumlama ::

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

Garip, ama buradaki tüm cevaplar benim için işe yaramadı. Benim için çalıştı başlatıcı

MigrateDatabaseToLatestVersion

İşte benim çözümüm (biliyorum, çok daha basit olabilir, ama bunu nasıl kullanırım):

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 sadece DropCreateDatabaseAlways öğesinden devralır, bu nedenle bazı özel durumlarda (test) tüm veritabanı yeniden oluşturulur. Aksi takdirde en son sürüme geçirilir.

Kaynağım: https://msdn.microsoft.com/en-us/data/jj591621.aspx#specific


0

İki uygulama için bir veritabanı kullandığımızda da aynı sorunu yaşadım. disableDatabaseInitialization="true"Bağlam türü bölümünde ayar yapmak benim için çalışıyor.

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

Daha fazla ayrıntı görün https://msdn.microsoft.com/en-us/data/jj556606.aspx


0

Özel bağlam başlatıcısı oluşturma:

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'ın Paket Yöneticisi Konsolu'ndaki geçiş komut satırı tarafından oluşturulan bir sınıf olduğunu unutmayın. Migrations.Configuration sınıfının dahili değiştiricisini genel olarak değiştirmeniz gerekebilir.

Ve OmModelCreating'inizden kaydedin:

public partial class MyDbContext : DbContext
{

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

        //other code for creating model
    }
}

-1

Burada bağlam değiştiğinde model yedekleme hatası önlemek başka bir yöntem paylaşmak istiyorum:

1) DbContext Dosyanızı Açın

2) Microsoft.AspNet.Identity.EntityFramework kullanarak ad alanı ekleyin;

3) public MyDbContext (): base ("name = MyDbContext") {Database.SetInitializer (yeni DropCreateDatabaseAlways ()); }

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.