我试图实现这个scenario。我创建了Code First模型,然后从模型生成了数据库sql,并通过MigSharp创建了手动迁移。之后,我已将代码添加到OnModelCreating
以更新映射。
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="data source=localhost\SQLEXPRESS;initial catalog=TestDB;integrated security=True;multipleactiveresultsets=True;App=EntityFramework"" 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 :(得分: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
希望它有所帮助。
修改强>
您正在使用
modelBuilder.Entity<Product>().ToTable("dfg_Product");
这就是它创建dbo.Product的原因。 使用
modelBuilder.Entity<Product>().MapSingleType().ToTable("dfg_Product");
并请使用DropCreateDatabaseAlways()
,这样您就可以获得一个包含正确映射的新数据库。
编辑2
在开发Code First应用程序时,您不需要连接字符串中的元数据信息,因此您的连接字符串应如下所示:
<add name="DataModelContainer" connectionString="Data Source=localhost\SQLEXPRESS;Initial Catalog=TestDB;integrated security=True;MultipleActiveResultSets=True;" providerName="System.Data.SqlClient" />