2011-08-24 116 views
4

我正在使用EF4.1與MVC3,我需要覆蓋,以防止EF創建一個數據庫,如果它不存在。我不想創建一個新的數據庫,而是希望捕獲錯誤,並報告連接字符串中的初始目錄(數據庫名稱)無效。如何防止EF4.1創建數據庫,如果它不存在?

但是,在開發過程中,我希望允許根據數據庫中的表/列創建新類/屬性的更新。

這裏有最佳做法或模式嗎?

回答

3

在我的應用程序中,我完全禁用上下文初始值設定項並手動處理數據庫映射和模式。

例如:

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

和自定義映射:

public class AccountMapper : EntityTypeConfiguration<Account> 
{ 
    /// <summary> 
    /// Employee entity mapper 
    /// </summary> 
    public AccountMapper() 
    { 
     ToTable("accounts"); 
     HasKey(x => x.Id); 
     ... 
    } 
} 
1

我會建議尋找到EF數據庫初始化,特別是IDatabaseInitializer接口。

如果您只是希望在數據庫不存在時停止創建數據庫,那麼只需將初始化程序設置爲null即可。但是如果你想記錄事件或其他事情,那就簡單地創建你自己的IDatabaseInitializer--這並不難。

然後,您可以設置初始化Application_Start在你的global.asax.cs像這樣:

Database.SetInitializer(new YourCustomInitializer()); 

作爲獎勵,這裏有一個例子IDatabaseInitializer,我用它來運行數據庫遷移(使用FluentMigrator)...如果我自己這麼說,這非常方便!

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(); 
    } 
} 
相關問題