我是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);
}
}