2011-08-30 112 views
9

我正在使用EF 4.1並使用DBContext等創建了一個存儲庫。將連接字符串設置爲指向SQL Server 2008 R2開發版。實體框架4.1代碼首先不創建表

當我運行一個控制檯應用程序調用我的網關,然後又添加一個實體並保存時,會拋出一個異常,說它無法找到表。當我查看我的數據庫時,創建了一個數據庫,但沒有自動創建除EmdMetadata之外的表格。

我錯過了什麼嗎?

馬克

回答

8

設置自動刪除並創建你會做這樣的事情...

public class MyDbContext : DbContext 
{ 
    public IDbSet<Foo> Foos { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     Database.SetInitializer(new MyDbContextInitializer()); 

     base.OnModelCreating(modelBuilder); 
    } 
} 

public class MyDbContextInitializer : DropCreateDatabaseIfModelChanges<MyDbContext> 
{ 
    protected override void Seed(MyDbContext dbContext) 
    { 
     // seed data 

     base.Seed(dbContext); 
    } 
} 
+0

看起來像我需要的東西,我不能在應用程序中調用它,因爲我在另一個dll中的Dbcontext上有一層,保持dbcontext內部。 – Mark

+3

這並沒有解決我的問題,但對於那些仍然有這個問題的人來說,OnModelCreating需要使用DbModelBuilder而不僅僅是模型構建器。不知道什麼時候改變。 – Pieter

8

您可以自己創建表 - 最簡單的方法是:

IObjectContextAdapter adapter = (IObjectContextAdapter)context; 
string script = adapter.ObjectContext.CreateDatabaseScript(); 
context.Database.ExecuteSqlCommand(script); 

其中上下文是我的EF 4.1數據庫環境。在此代碼之前,我刪除所有表(從上次創建數據庫開始),並在此之後使用數據對其進行種子處理。

+0

真的嗎?我正在關注一些博客教程,他們似乎在他們稱爲「保存」時自動生成了它們。 – Mark

+0

我只用了一個月,這是我能夠可靠地刪除,重建和播種我的數據庫的唯一方法。也許我太容易放棄了。 – iandotkelly

+0

我看了幾個教程(在谷歌上找到) - 一個包含一些示例SQL創建腳本,一個像你說的那樣自動創建數據庫。和你一樣,我發現這對我創建的數據庫結構不起作用,其中包括一些參照完整性和級聯刪除。 – iandotkelly

-1

您需要添加到您的Application_Start()

Database.SetInitializer(new MyDbContextContextInitializer()); 
var context = new MyDbContextContext(); 
context.Database.Initialize(true); 

最後一行強制DB創建

1

更好:將初始化程序添加到靜態構造函數中,如下所示:

public class MyDbContext : DbContext 
{ 
    static MyDbContext() 
    { 
     Database.SetInitializer(new MyDbContextContextInitializer()); 
    } 
}