2016-03-08 53 views
1

我正在嘗試設置與使用實體框架,Autofac和標識2.0 這裏我的應用程序上下文類管理角色的初始用戶撥打種子方法:IdentityDbContext不會從我的數據庫初始化

public class ApplicationContext<TUser> : IdentityDbContext<TUser> where TUser : IdentityUser 
{ 
    public ApplicationContext(string conectionString) : base(conectionString) 
    { 
     Database.SetInitializer(new MyContextInitializer()); 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //entities builder and configuration 
    } 
} 

和我自定義初始化程序:

class MyContextInitializer : DropCreateDatabaseIfModelChanges<ApplicationContext<IdentityUser>> 
{ 
    protected override void Seed(ApplicationContext<IdentityUser> context) 
    { 
     //seeding data 
    } 
} 

問題是種子方法從來沒有被調用過。發生了什麼以及如何解決這個問題?感謝您的提前!

+0

我不認爲這是可能的,如果你留在你的應用程序上下文中的通用 - '的ApplicationContext '是不是隱含轉換爲'的ApplicationContext ' 。您可能可以將通用參數添加到MyContextInitializer中,並使用TUser作爲其Seed方法 - 儘管現在無法檢查。 –

+0

@raderick謝謝你的回覆,但我從上下文中刪除了泛型,一切正常! – user3818229

回答

3

從我的理解,你必須在之前調用Database.SetInitializer()任何實例被創建(包括在構造函數中)。

一種方法是使用一個靜態構造函數:

public class ApplicationContext : IdentityDbContext<TUser> 
    where TUser : IdentityUser 
{ 
    static ApplicationContext() 
    { 
    Database.SetInitializer<ApplicationContext>(new MyContextInitializer()); 
    } 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
    //entities builder and configuration 
    } 
} 
+0

好的。那也是我的地方。 –

+0

@SteveGreene Idk爲什麼當我從ApplicationContext類中移除''類型時問題就消失了。 – user3818229

+0

也許是這樣,但靜態構造函數(或Global.asax)是一個更好的位置,或者每次構建實例時都會運行代碼。 http://stackoverflow.com/questions/8679562/place-to-put-database-setinitializer –