我正在使用MVC5和EF6 . 我正在做代码优先的方法 . 我有一些表需要使用迁移(工作)和我需要从现有数据库表使用的一些表生成 .
在我有的DbContext类中
'new table that is created in the DB (works)
public DbSet<Subscription> Subscriptions { get; set; }
public DbSet<Memeber> Members { get; set; }
'existing table.
public DbSet<CodeTable> CodeTable { get; set; }
在配置 - (迁移文件夹)
public Configuration()
{
AutomaticMigrationsEnabled = true;
}
它现在做了什么,它创建了一个名为CodeTable的新表 s
-
它变成复数,为什么? - 它可以关闭吗?
-
如何使用CodeTable而不生成新表?
-
当我手动删除使用codefirst生成的表时,即成员表 . 然后我跑了
Update-Database -Verbose -Force(不做任何事情)
使用StartUp项目'Test' .
使用NuGet项目'Test' .
指定'-Verbose'标志以查看应用于目标数据库的SQL语句 .
目标数据库是:'TESTDB'(DataSource:10.10.50.89,提供者:
System.Data.SqlClient,Origin:Configuration) .
没有待定的显式迁移 .
运行种子方法 .
然后运行应用程序,我得到一个例外
System.Data.SqlClient.SqlException(0x80131904):无效的对象名称'dbo.Members' . 在System.Data.SqlClient.SqlConnection.OnError(SqlException异常
因为没找到表 . 表格未生成 .
如果找不到表,我怎么知道呢 . 创造它?
我注意到我是否删除__MigrationHistory然后运行Update-Database . 然后它抱怨我存在的其他表
数据库中已有一个名为'Subscriptions'的对象 .
它只有在我删除所有表格时才有效 . 但这似乎很愚蠢,删除所有表格 . 我希望还有另一种方法 .
1 回答
要首先使用现有数据库的代码,您需要做两件事:1)指定连接字符串和2)关闭数据库初始化策略 . 使用以下上下文示例可以实现这两件事:
现在,按照惯例,实体框架假定您的表名是实体类名的复数形式 . 如果表名不是复数和/或它与实体类名不同,那么您可以使用
Table
属性来准确指定它应该是什么:同样,如果列名称与属性名称不匹配,则可以使用
Column
属性指定:UPDATE
在第一次阅读时,我没有注意到您尝试将现有表与首先由代码生成的表混合和匹配的事实 . 你不能做这个 . 由于使用现有数据库/现有表需要禁用初始化策略,因此该数据库中的所有表都必须存在,或者Entity Framework必须生成所有表 . 你不能走到一半 .
如果你需要利用一些现有的表并让EF创建一些,你需要两个数据库和两个上下文,一个是EF首先通过代码生成所有内容,另一个是初始化策略关闭,你负责数据库和表 . 重要的是,这意味着你不能混用和匹配这些 . 您的所有代码第一个实体都不能通过导航属性引用任何现有数据库实体,或者它们将隐式添加到代码第一个上下文中,EF将生成表 .
您可以做的最好的事情是拥有一个包含相关实体ID的常规属性,然后手动使用此id从现有数据库上下文中查找实体 . 换句话说,它不会是真正的外键,你将无法利用延迟加载等 .