15

4.1'den beri bu sorunla uğraşmaktayım (şimdi 4.3'teyim).tohum yöntemi EntityFramework ile çağrılmadı CodeFirst

1) SQLServer 2 boş bir veri katalog oluşturma) aşağıdaki kodu yürütün::

Database.SetInitializer(new DropCreateDatabaseAlways<SiteDB>()); 

Yapmam olması gereken tüm şudur, tohum yöntemi denir almak Bana öyle geliyor Ben şöyle benim SiteDB tanımlanmıştır:

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
      ... (break point set here that never gets hit) 

bu benim tablolar oluşturur, ancak tohum yöntemini çağıran asla çünkü ben çok basit bir şey eksik gerekir gibi hissediyorum.

Bunu daha açık hale getirmek için, burada tüm kodu içeren tam bir örnek verilmiştir. Onu çalıştırdığınızda, tohum denir geçmez:

using System; 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.Linq; 
using System.Text; 
using System.Data.Entity; 

namespace ConApp 
{ 
internal class Program 
{ 
    private static void Main(string[] args) 
    { 
     Database.SetInitializer(new SiteDBInitializer()); 
     using (var db = new SiteDB()) 
     { 
      var x = db.Customers; 
     } 
    } 
} 

public class SiteDB : DbContext 
{ 
    public DbSet<Customer> Customers { get; set; } 
} 

public class Customer 
{ 
    [Key] 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long Id { get; set; } 

    public string LastName { get; set; } 
} 

public class SiteDBInitializer : 
    DropCreateDatabaseAlways<SiteDB> 
{ 
    protected override void Seed(SiteDB db) 
    { 
     db.Customers.Add(new Customer() {LastName = "Kellner"}); 
     db.Customers.Add(new Customer() {LastName = "Jones"}); 
     db.Customers.Add(new Customer() {LastName = "Smith"}); 
     db.SaveChanges(); 
    } 
} 

} 

cevap

8

yerine Database.SetInitializer(new SiteDBInitializer()); çağrı gerekir.

+1

Şunu mu demek istediniz: Database.SetInitializer (new SiteDBInitializer()); Bunu denedim ve işe yaramadı. –

+1

@PeterKellner İlk kez bir şey yaptığınızda (örn. Sorgulama) çağrılır. Bir sorguyu çalıştırmayı denediniz mi? – Eranga

+0

Merhaba Eranga ve J.W. Sorumluluğumun, tohumun çağrılması gerektiğine inandığım bir önemsiz konsol uygulaması içerecek şekilde güncelledim. Bir göz atabilirseniz (hatta yapıştırıp çalıştırırsanız), gerçekten takdir ediyorum. Eminim eksik bir şey var eminim ama aylardır çıldırıyor. –

0

Bunun için tüm yanıtlara baktım, gerçekten hiçbir şey işe yaramadı ve DB mevcut olmadığında Tohum yöntemini çağırmamak için Microsoft hatası olup olmadığını merak ediyorum.

Bağlam sınıfını:

:

class AlisDbContext : DbContext 
{ 
    public class MyContextFactory : IDbContextFactory<AlisDbContext> 
    { 
     public AlisDbContext Create() 
     { 
      return new AlisDbContext("CompactDBContext"); 
     } 
    } 

    public AlisDbContext(string nameOrConnectionString) : base(nameOrConnectionString) 
    { 
     Database.SetInitializer(new AlisDbInitializer(this)); 
     Database.SetInitializer(new DropCreateDatabaseIfModelChanges<AlisDbContext>()); 
    } 

    public DbSet<SavedCredentials> SavedCredentialses { get; set; } 
} 

Sonra AlisDbInitializer gibi tohum yöntemini kontrol etmek ve çağırmanız gerekir çalıştı sadece kod, aslında DB var yoksa sınıf tohum çağrı yapmaktı

public AlisDbInitializer(AlisDbContext alisDbContext) 
    { 
     if (!alisDbContext.Database.Exists()) 
     { 
      Seed(alisDbContext); 
     }   
    } 
İlgili konular