15

4.1以降でこの問題の解決に苦労しました(現在は4.3です)。その種のメソッドが呼び出され得るために私には思える私がしなければならない必要があるすべては以下の通りです:EntityFrameworkでシードメソッドが呼び出されていませんCodeFirst

1)SQLServerの 2の空のデータカタログを作成します)以下のコードを実行します。

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

を私は次のように私のSiteDBが定義されている:

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

これが私のテーブルを作成しますが、シードメソッドを呼び出すことはありませんんので、私は非常に単純な何かが欠けする必要がありますように私は感じます。

これをより明確にするために、ここにはすべてのコードを含む完全な例があります。私はそれを実行すると、種子が呼び出されることは決してありません:

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

} 

答えて

8

代わりDatabase.SetInitializer(new SiteDBInitializer());を呼び出す必要があります。

+1

私はあなたが意味すると思います:Database.SetInitializer(new SiteDBInitializer());私はそれを試みたが、どちらもうまくいかなかった。 –

+1

@PeterKellner初めてクエリを実行するときに呼び出されます。あなたはクエリを実行しようとしましたか? – Eranga

+0

こんにちはEranga and J.W.私はシードを呼び出す必要があり、そうでないと思う簡単なコンソールアプリケーションを含めるように質問を更新しました。あなたが一見(とそれを貼り付けるとそれを実行する)ことができれば、私は本当にそれを感謝します。私は何かシンプルなものがあると確信していますが、それは何ヶ月も夢中になっています。 –

0

私はそれについてすべての答えを見ましたが、何も実際には機能しません、そして、それはDBが存在しないときにSeedメソッドを呼び出さないMicrosoftのバグでしょうか。

Contextクラス:

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

を次にAlisDbInitializerは次のようにシード方法をチェックして呼び出す必要が 働いていた唯一のコードは、実際にクラスがDBが存在しない場合は、種子を呼び出す作ることでした

public AlisDbInitializer(AlisDbContext alisDbContext) 
    { 
     if (!alisDbContext.Database.Exists()) 
     { 
      Seed(alisDbContext); 
     }   
    } 
関連する問題