DbContext表映射

mir*_*ych 3 c# entity-framework entity-framework-4

我试图实现这种情况.我创建了Code First模型,然后从模型生成了数据库sql,并通过MigSharp创建了手动迁移.之后我添加了代码OnModelCreating来更新映射.

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

问题是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" />
Run Code Online (Sandbox Code Playgroud)

通过将连接字符串更改为:

<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)

Mat*_*cic 5

如果您之前执行过您的应用程序且模型保持不变,则数据库已存在且OnModelCreating()不会被调用.

您可以使用 Database.SetInitializer()

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

另外我注意到你正在使用FluentAPI,我想指出你也可以使用属性进行映射:

[Table("dfg_Product")]
public class Product
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.

编辑:

您正在使用

modelBuilder.Entity<Product>().ToTable("dfg_Product");
Run Code Online (Sandbox Code Playgroud)

这就是它创建dbo.Product的原因.使用

modelBuilder.Entity<Product>().MapSingleType().ToTable("dfg_Product");
Run Code Online (Sandbox Code Playgroud)

请使用,DropCreateDatabaseAlways()这样你就可以获得一个具有正确映射的新数据库.

编辑2

在开发Code First应用程序时,您不需要连接字符串中的元数据信息,因此您的连接字符串应如下所示:

<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />
Run Code Online (Sandbox Code Playgroud)