Entity framework 4.1 如果EF4.1没有创建DB,如何防止其创建';不存在?
我正在将EF4.1与MVC3一起使用,如果它不存在,我需要一个覆盖来防止EF创建db。我不想创建一个新的数据库,而是想捕获错误并报告初始目录(数据库名称)在连接字符串中无效 但是,在开发过程中,我希望允许更新新的类/属性,以便在数据库中创建相应的表/列Entity framework 4.1 如果EF4.1没有创建DB,如何防止其创建';不存在?,entity-framework-4.1,Entity Framework 4.1,我正在将EF4.1与MVC3一起使用,如果它不存在,我需要一个覆盖来防止EF创建db。我不想创建一个新的数据库,而是想捕获错误并报告初始目录(数据库名称)在连接字符串中无效 但是,在开发过程中,我希望允许更新新的类/属性,以便在数据库中创建相应的表/列 这里有最佳实践或模式吗?在我的应用程序中,我完全禁用了上下文初始值设定项,并手动处理数据库映射和模式 例如: public class AppDbContext : DbContext { public IDbSet<Account
这里有最佳实践或模式吗?在我的应用程序中,我完全禁用了上下文初始值设定项,并手动处理数据库映射和模式 例如:
public class AppDbContext : DbContext
{
public IDbSet<Account> Accounts { get; set; }
public AppDbContext() : base("connection_string")
{
Database.SetInitializer<AppDbContext>(null); // Important! Dont use entity framework initializer !important
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
/* Register custom mapping class */
modelBuilder.Configurations.Add(new AccountMapper());
base.OnModelCreating(modelBuilder);
}
}
公共类AppDbContext:DbContext
{
公共IDbSet帐户{get;set;}
public AppDbContext():base(“连接字符串”)
{
Database.SetInitializer(null);//重要!不要使用实体框架初始值设定项!重要
}
模型创建时受保护的覆盖无效(DbModelBuilder modelBuilder)
{
/*注册自定义映射类*/
添加(新的AccountMapper());
基于模型创建(modelBuilder);
}
}
和自定义映射:
public class AccountMapper : EntityTypeConfiguration<Account>
{
/// <summary>
/// Employee entity mapper
/// </summary>
public AccountMapper()
{
ToTable("accounts");
HasKey(x => x.Id);
...
}
}
公共类AccountMapper:EntityTypeConfiguration
{
///
///雇员实体映射器
///
公共帐户映射器()
{
总计(“账户”);
HasKey(x=>x.Id);
...
}
}
我建议查看EF数据库初始值设定项,特别是IDatabaseInitializer
接口
如果您只是想让它在数据库不存在时停止创建数据库,那么只需将初始值设定项设置为null
。但是,如果您想记录事件或类似事件,只需创建自己的IDatabaseInitializer
——这并不难
然后,您可以在global.asax.cs中设置初始值设定项应用程序\u Start
,如下所示:
Database.SetInitializer(new YourCustomInitializer());
作为奖励,这里有一个示例IDatabaseInitializer
,我使用它运行数据库迁移(使用)。。。如果我自己这么说的话,它非常方便
public class MigrationsDbContextInitializer : IDatabaseInitializer<YourDbContext>
{
private static readonly ILog Logger = LogManager.GetLogger(typeof(MigrationsDbContextInitializer));
public void InitializeDatabase(YourDbContext context)
{
var announcer = new BaseAnnouncer(x => Logger.Info(x));
var runnerContext = new RunnerContext(announcer)
{
Database = "sqlserver2008",
Connection = context.Database.Connection.ConnectionString,
Target = "YourEntitiesNamespace",
PreviewOnly = false,
Task = "migrate"
};
new TaskExecutor(runnerContext).Execute();
}
}
公共类迁移DbContextInitializer:IDatabaseInitializer
{
私有静态只读ILog Logger=LogManager.GetLogger(typeof(MigrationsDbContextInitializer));
public void InitializeDatabase(YourDbContext上下文)
{
var announcer=newBaseAnnouncer(x=>Logger.Info(x));
var runnerContext=新的runnerContext(播音员)
{
Database=“sqlserver2008”,
Connection=context.Database.Connection.ConnectionString,
Target=“YourEntitiesNamespace”,
PreviewOnly=false,
Task=“迁移”
};
新建TaskExecutor(runnerContext).Execute();
}
}