Database.SetInitializer无法处理自定义数据库初始化程序

时间:2014-11-02 15:43:26

标签: c# entity-framework asp.net-mvc-4 entity-framework-6

我是Entity Framework的新手。我想了解自定义Database intializer,因为我的代码给了我以下错误:' System.Data.Entity.Database.SetInitializer(System.Data.Entity.IDatabaseInitializer)'有一些无效的论点。

以下是我的代码:

public class ClassifiedsContext : DbContext
{

    public ClassifiedsContext()
        : base(DataStorage.GetConnectionStringValue("AdsContext"))
    {
    }

    public DbSet<Category> Category { get; set; }
    public DbSet<SubCategory> SubCategory { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {           
        base.OnModelCreating(modelBuilder);
    }
}

接口IDatabaseInitializer

 public interface IDatabaseInitializer<TContext> where TContext : global::System.Data.Entity.DbContext
{        
    void InitializeDatabase(TContext context);
}

class DropCreateDatabaseTables

 public class DropCreateDatabaseTables : IDatabaseInitializer<ClassifiedsContext>
{
    public void InitializeDatabase(ClassifiedsContext context)
    {
        bool dbExists;
        using (new TransactionScope(TransactionScopeOption.Suppress))
        {
            dbExists = context.Database.Exists();
        }
        if (dbExists)
        {
            // remove all tables
            context.Database.ExecuteSqlCommand("EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\"");

            // create all tables
            var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
            context.Database.ExecuteSqlCommand(dbCreationScript);

            Seed(context);
            context.SaveChanges();
        }
        else
        {
            throw new ApplicationException("No database instance");
        }
    }

    protected virtual void Seed(ClassifiedsContext context)
    {
        /// TODO: put here your seed creation
    }
}

我从global.asax

调用DropCreateDatabaseTables类
protected void Application_Start()
{
 Database.SetInitializer<ClassifiedsContext>(new DropCreateDatabaseTables());
//I also tried this line
//Database.SetInitializer(new DropCreateDatabaseTables()); also gives me error
}

现在我的代码在global.asax文件中给出了错误

  

&#39; System.Data.Entity.Database.SetInitializer(System.Data.Entity.IDatabaseInitializer)&#39;   有一些无效的论点。

这是从global.asax或DBcontext调用Database.SetInitializer的更好方法

请帮帮我。 感谢

编辑2: 这是我的新代码:

 public class DropCreateDatabaseTables : DropCreateDatabaseIfModelChanges<ClassifiedsContext>
{
    public override void InitializeDatabase(ClassifiedsContext context)
    {
        bool dbExists;
        using (new TransactionScope(TransactionScopeOption.Suppress))
        {
            dbExists = context.Database.Exists();
        }
        if (dbExists)
        {             
            context.Database.ExecuteSqlCommand("EXEC sp_MSforeachtable @command1 = \"DROP TABLE ?\"");              
            var dbCreationScript = ((IObjectContextAdapter)context).ObjectContext.CreateDatabaseScript();
            context.Database.ExecuteSqlCommand(dbCreationScript);

            Seed(context);
            context.SaveChanges();
        }
        else
        {
            throw new ApplicationException("No database instance");
        }
    }

    protected override void Seed(ClassifiedsContext context)
    {
        base.Seed(context);           
    }
}

0 个答案:

没有答案
相关问题