我正在使用EF4.1與MVC3,我需要覆蓋,以防止EF創建一個數據庫,如果它不存在。我不想創建一個新的數據庫,而是希望捕獲錯誤,並報告連接字符串中的初始目錄(數據庫名稱)無效。如何防止EF4.1創建數據庫,如果它不存在?
但是,在開發過程中,我希望允許根據數據庫中的表/列創建新類/屬性的更新。
這裏有最佳做法或模式嗎?
我正在使用EF4.1與MVC3,我需要覆蓋,以防止EF創建一個數據庫,如果它不存在。我不想創建一個新的數據庫,而是希望捕獲錯誤,並報告連接字符串中的初始目錄(數據庫名稱)無效。如何防止EF4.1創建數據庫,如果它不存在?
但是,在開發過程中,我希望允許根據數據庫中的表/列創建新類/屬性的更新。
這裏有最佳做法或模式嗎?
在我的應用程序中,我完全禁用上下文初始值設定項並手動處理數據庫映射和模式。
例如:
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);
...
}
}
我會建議尋找到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();
}
}