2016-03-08 18 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 –