stu*_*net 24 c# entity-framework azure
我在第762次遇到这个错误,但是这次我在尝试访问我的生产网站后立即获取它,直接删除Azure上的"生产"数据库然后发布我的网站.
The model backing the 'PropertyContext' context has changed since the database was created. Consider using Code First Migrations to update the database
Run Code Online (Sandbox Code Playgroud)
我删除了数据库,因为我无法以任何其他方式修复此问题,但它仍然无法正常工作.
一些要点:
我在我的Global.asax中尝试了以下内容(在两个项目中)
Database.SetInitializer PropertyContext>(null); < - SO不会让我把第一个<
和
Database.SetInitializer(new MigrateDatabaseToLatestVersion<PropertyContext, MyConfiguration>());
new PropertyContext().Database.Initialize(true);
Run Code Online (Sandbox Code Playgroud)
我正在使用.net 4.5
为什么我在新数据库上收到此错误,如何才能使此站点正常工作?
sev*_*tov 36
刚刚在ASP.Net应用程序中遇到了同样的错误.在我的情况下,我没有使用Code First,但我使用标准的ASP.Net身份验证提供程序,显然使用Code First,并且由于此问题而导致身份验证被破坏.
对我来说,解决方案是删除dbo.__MigrationHistory表,之后认证开始正常工作.意识到!这个解决方案并不适合所有人!这将解决问题,但它有潜在的风险.
ASP.Net身份验证提供程序自动在数据库中创建表:
默认情况下,表是空的,如果您没有为您的网站创建任何新登录,您可以使用上面的"快速和脏"解决方案.如果您确实关心保留用户信息或只关注Code First迁移的工作方式,请按照下列步骤操作:
<connectionStrings>元素下的记录之一.打开包管理器控制台:
工具 - >库包管理器 - >包管理器控制台
Update-Database -ConnectionStringName MyConnectionStringNameRun Code Online (Sandbox Code Playgroud)
将MyConnectionStringName替换为您在web.config中查找的实际名称.
作为此命令的结果,您将看到一个新文件夹"Migrations",其中包含由该Update-Database命令生成的一堆代码.重新构建和重新部署您的应用程序,您的新迁移代码将在启动时执行,并使数据库架构与ASP.Net身份验证提供程序代码的更新版本同步.
Tal*_*lon 27
使用Code First with Migrations时,数据库会创建一个名为__MigrationHistory跟踪当前架构的表.运行应用程序时,Entity Framework将检查此表以确保数据库模式与数据库实体匹配.如果它们不匹配,您将收到此错误.
要更新数据库,请按以下步骤操作:
DbContextApp.Config/ Web.Configfile 的项目是"Set as Startup Project"(如果您有多个Configs,则必须是定义了数据库连接字符串的项目).Update-Database -ConnectionStringName MyConnString,其中MyConnString是名称的连接字符串(而不是实际的连接字符串)在你的App.Config/Web.Config如果您收到如下错误:"无法更新数据库以匹配当前模型,因为存在挂起的更改并且已禁用自动迁移."
您应该启用自动迁移,然后重试.启用自动迁移
Migrations文件夹中(与您的项目中DbContext),打开Configuration.cs.AutomaticMigrationsEnabled = true;要阻止Entity Framework/DbContext监视数据库上的更改,您只需删除__MigrationHistory数据库中的表即可.然后由您决定数据库是否仍然手动更新.
解决方法是使用静态方法SetInitializer并将上下文绑定为Null值.如果您正在使用Web解决方案,那么编写代码的最佳位置是在Global.asax.cs文件的Application_Start中.
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
RegisterRoutes(RouteTable.Routes);
//...
Database.SetInitializer<MyContext>(null);
}
Run Code Online (Sandbox Code Playgroud)