2012-03-03 52 views
4

我試圖實現這個scenario。我創建了Code First模型,然後從模型生成數據庫sql,並通過MigSharp創建了手動遷移。之後,我添加了代碼OnModelCreating來更新映射。DbContext表映射

protected void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Product>().ToTable("dfg_Product"); 
    modelBuilder.Entity<Customer>().ToTable("dfg_Customer"); 
} 

問題是,仍然的DbContext試圖從默認映射「dbo.Product | dbo.Customer」的數據,我需要改變映射「dbo.dfg_Product | dbo.dfg_Customer」。 我試圖調試但OnModelCreating沒有調用代碼。

請幫忙,我做錯了什麼?

編輯:添加連接字符串

<add name="DataModelContainer" connectionString="metadata=res://*/DataModel.csdl|res://*/DataModel.ssdl|res://*/‌​DataModel.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=localhost\SQLEXPRESS;initial catalog=TestDB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /> 

問題是通過改變連接字符串來解決:如果您之前執行的應用程序和模型保持不變

<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" /> 
+0

我看不到任何東西你的代碼立即出錯。如果OnModelCreating根本沒有被調用,那麼可能是因爲你沒有使用Code First,而是使用了項目中的EDMX。你的連接字符串是什麼樣的? – 2012-03-04 00:06:11

+0

已添加到問題。所有表格都已在數據庫中創建,但帶有前綴。我需要的只是配置EF在表名之前添加此前綴。 – mironych 2012-03-04 00:20:29

回答

5

,數據庫已經在那裏,並且OnModelCreating()不會被調用。

您可以使用Database.SetInitializer()

static void Main(string[] args) 
{ 
    Database.SetInitializer(
      new DropCreateDatabaseIfModelChanges<YourContext>()); 
    //or 
    Database.SetInitializer(
      new DropCreateDatabaseAlways<YourContext>()); 
    //your code 
} 

此外,我注意到您正在使用FluentAPI,我想指出,你也可以使用屬性的映射:

[Table("dfg_Product")] 
public class Product 

希望它能幫助。

編輯:

您正在使用

​​

,這就是爲什麼它創造dbo.Product。 使用

modelBuilder.Entity<Product>().MapSingleType().ToTable("dfg_Product"); 

,並請使用DropCreateDatabaseAlways()所以你會得到一個新的數據庫與正確的映射。

EDIT 2

開發代碼第一次應用程序時,您無需在連接字符串中的元數據信息,以便您的連接字符串應該是這樣的:

<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" /> 
+0

嘗試使用[表(「dfg_Product」)]但它沒有幫助。 – mironych 2012-03-03 23:01:39

+1

在EF 4.3中沒有像MapSingleType()這樣的方法。關於DropCreateDatabaseAlways。我正在使用我的自定義遷移,並且我不想通過EF創建它們。我不想使用EF的任何生成或遷移功能。我所需要的所有EF都是將我的POCO映射到DB中的表格,並讓我訪問它們。 – mironych 2012-03-03 23:37:44

+0

你在某處定義連接字符串嗎?如果是這樣,開發Code First應用程序時不需要連接字符串中的元數據信息。編輯:添加連接字符串來回答。 – 2012-03-04 00:21:55