在mvc5应用程序中,我创建了一个CodeFirst数据模型,并对其进行了多次迁移。
然后我重构了我的项目,并将所有数据/迁移类移动到一个新项目,该项目由我的表示层引用。
dbcontext在项目更改后成功连接并对DB执行读/写操作。
当我对模型进行微小更改并运行add-migration
时,EF使用代码创建了一个迁移,从头开始创建数据库,就像它没有“看到”现有表一样。
当然,我跑的时候
Get-Migrations -ConfigurationTypeName ConfigurationDbContext
我得到了
No migrations have been applied to the target database.
数据库中的__MigrationHistory
完好无损,迁移/配置类命名空间未更改。此外,显然,ConnectionString是正常的,否则他将无法使用数据库,我会得到“自创建数据库以来支持上下文的模型”或类似的错误。
修改
正如评论中所建议的,我在DbContext构造函数中指定了确切的连接字符串,而不是web.config中的connectionstirng名称,就像在原始mvc项目中一样。
运行Get-Migrations和update-databse时,db中仍然没有历史记录/更改。
当我运行Get-Migrations -ConfigurationTypeName My_Namespace.Migrations.ConfigurationDbContext.ConfigurationDbContext
我得到了
No migrations have been applied to the target database.
如果我尝试指定连接字符串
Get-Migrations -ConfigurationTypeName My_Namespace.Migrations.ConfigurationDbContext.ConfigurationDbContext -ConnectionString "Server=my_server;Initial Catalog=my_catalog;User Id=my_user;Password=my_pass" -ConnectionProviderName="System.Data.SqlClient" -verbose -debug
PM卡在>>
符号上,直到我重新启动或清除窗口...
如果我省略ConnectionProviderName="System.Data.SqlClient"
,控制台会要求我输入它,在我输入后,它会显示与正确数据库的连接,
Target database is: 'my_catalog (DataSource: my_server Provider: System.Data.SqlClient, Origin: Explicit)
但仍然没有迁移......
No migrations have been applied to the target database.
为什么能够以及如何进一步调查/解决此问题?
编辑2:
我的dbcontext的构造函数很简单:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base(
"Server=my_server_name;Initial Catalog=my_db_name;UserId=my_username;Password=my_password"
)
{}
public DbSet<Model1> Model1Entities { get; set; }
public DbSet<Model2> Model2Entities { get; set; }
public DbSet<Model3> Model3Entities { get; set; }
}
它基于IdentityDbContext,就像模板mvc5应用程序一样,因为我不想为它创建不同的dbcontext。
并且ConfigurationDbContext是自动的
internal sealed class ConfigurationDbContext : DbMigrationsConfiguration<ApplicationDbContext>
{
public ConfigurationDbContext()
{
AutomaticMigrationsEnabled = false;
}
protected override void Seed(ApplicationDbContext context)
{
}
}
谢谢!
答案 0 :(得分:6)
嗯,答案是,在重构期间,ConfigurationDbContext
的命名空间从
demo10.Migrations.ConfigurationDbContext
到
demo10.Migrations.ConfigurationDbContext.ConfigurationDbContext
并且ContextKey
表的__MigrationHistory
列应该是ConfigurationDbContext
命名空间(您可以省略DbContext,比如
demo10.Migrations.Configuration
表中的
demo10.Migrations.ConfigurationDbContext
命名空间)。
答案 1 :(得分:3)
在这里留下答案,因为我有一个类似的问题,但这个问题没有解决:
我在app.config中输入的密码错误,我在不同的环境中使用。 Get-Migrations没有提供有关失败凭据的错误,它只是告诉您“没有迁移已应用于目标数据库”,这极具误导性。
希望遇到此问题的其他人会发现它就像连接字符串中的拼写错误一样简单!
编辑:在回答关于我的错字的错误中拼写错字这个词的讽刺。
答案 2 :(得分:0)
我在SQL Server Management Studio中打开__MigrationHistory表时遇到了开发中的问题... 关闭表格(没有打开进行编辑,只需选择),以某种方式修复了所有内容。
答案 3 :(得分:0)
使用我自己的小工具进行检查:检查数据库是否处于混合模式或纯粹处于Windows身份验证模式。
2014年的安装横盘整理,导致sa被禁用并且没有授权的Windows帐户(客户端将主机升级到2014,因此我必须将其升级)。我设法将其备份并重新获得Windows帐户访问权限(真实情况下的伏都教狗屎),但没有意识到它仅停留在Windows身份验证模式下。一旦将其切换回混合模式,我突然又重新建立了连接。噢!
答案 4 :(得分:0)
这只是我现在发生的问题,问题是我的sa密码已过期并且需要重设。我仍然从上一个会话登录,因此我可以毫无疑问地运行查询,但是当我断开连接并重新连接时,我必须重设密码!花了我一个小时来弄清楚:/
答案 5 :(得分:0)
当我将代码分成多个项目时,我遇到了这个问题。通过将解决方案的默认项目设置为具有正确连接字符串的默认项目来解决。 通过运行以下命令获取提示:
get-migrations -Verbose
eflocation\ef6.exe migrations list --verbose --no-color --prefix-output --assembly dataproject \project.dll --project-dir dataproject\ --language C# --data-dir defaultproject\App_Data --root-namespace dataproject --config defaultproject\Web.config
运行命令后看到的Web.config或app.config文件应来自默认项目。