EF先用现有表格代码
我正在使用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 的新表
更新数据库-Verbose -Force(这没有做任何事情)
使用启动项目“测试”。
使用NuGet项目“测试”。
指定'-Verbose'标志来查看应用于目标数据库的SQL语句。
目标数据库是:'TESTDB'(数据源:10.10.50.89,提供者:
System.Data.SqlClient,来源:配置)。
没有待处理的显式迁移。
运行Seed方法。
然后运行应用程序,我得到一个异常
System.Data.SqlClient.SqlException(0x80131904):无效的对象名称'dbo.Members'。 在System.Data.SqlClient.SqlConnection.OnError(SqlException异常
因为没有找到表格。 表格不会生成。
我怎么让它知道,如果没有找到表。 创造它?
我注意到如果我删除__MigrationHistory,然后运行更新数据库。 然后它抱怨我存在的其他表格
数据库中已经有一个名为'Subscriptions'的对象。
只有当我删除所有的表格时它才有效。 但这似乎很愚蠢,删除所有表格。 我希望有另一种方法。
要在现有数据库中首先使用代码,您需要做两件事:1)指定连接字符串,2)关闭数据库初始化策略。 这两件事情可以通过以下上下文示例来实现:
public class ApplicationDbContext : DbContext
{
public ApplicationDbContext()
: base("ConnectionStringName")
{
Database.SetInitializer<ApplicationDbContext>(null);
}
// DbSets here
}
现在,按照惯例,实体框架假定您的表名称是实体类名称的复数形式。 如果表名不是复数形式,并且/或者它与实体类名不相同,那么可以使用Table
属性来指定它应该是什么:
[Table("foo_table")]
public class Foo
{
// properties
}
同样,如果您的列名称与您的属性名称不匹配,则可以使用Column
属性指定这些名称:
[Column("strFoo")]
public string Foo { get; set; }
UPDATE
在第一次阅读时,我没有注意到你试图混合和匹配现有表格与代码首先生成的表格的事实。 你不可以做这个。 由于使用现有数据库/现有表需要禁用初始化策略,因此该数据库中的所有表必须存在,否则实体框架必须生成所有表。 你不能半途而废。
如果您需要利用一些现有的表并使EF创建一些表,并且需要两个数据库和两个上下文,其中EF将首先通过代码生成所有内容,另一个则是初始化策略关闭并且您负责数据库和表的操作。 重要的是,这意味着你不能混合和匹配这些。 您的所有代码第一个实体不能通过导航属性引用任何现有数据库实体,否则它们将隐式添加到代码第一个上下文中,EF将生成表。
您可以做的最好的方法是拥有一个包含相关实体的ID的常规属性,然后手动使用此ID从现有数据库上下文中查找实体。 换句话说,它不会是一个真正的外键,并且您将无法使用延迟加载等。
链接地址: http://www.djcxy.com/p/90287.html