2012-03-03 144 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