Entity framework 4.1 如果EF4.1没有创建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

我正在将EF4.1与MVC3一起使用,如果它不存在,我需要一个覆盖来防止EF创建db。我不想创建一个新的数据库,而是想捕获错误并报告初始目录(数据库名称)在连接字符串中无效

但是,在开发过程中,我希望允许更新新的类/属性,以便在数据库中创建相应的表/列


这里有最佳实践或模式吗?

在我的应用程序中,我完全禁用了上下文初始值设定项,并手动处理数据库映射和模式

例如:

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();
}
}