.net - tutorial - 自从创建数据库以来,支持'ApplicationDbContext'上下文的模型已经发生了变化




entity framework code first教程 (10)

首先,我没有在其他地方看到过这个错误,我想它不是一个复制品,所以请先阅读整个情况

每一件事情都工作得很好,然后我试着更新我的一个模型类应用程序类和更新现在留下评论),我将在下面列出并繁荣,我有这个丑陋的错误。

自从创建数据库以来,支持'ApplicationDbContext'上下文的模型已经发生了变化。 考虑使用Code First Migrations来更新数据库( http://go.microsoft.com/fwlink/?LinkId=238269 )。 在System.Data.Entity.CreateDatabaseIfNotExists 1.InitializeDatabase(TContext context) at System.Data.Entity.Internal.InternalContext.<>c__DisplayClassf 1.b_ e()at System.Data.Entity.Internal.InternalContext.PerformInitializationAction(Action action )System.Data.Entity.Internal.LazyInternalContext.b中System.Data.Entity.Internal.Internal.PerformDatabaseInitialization()System.Data.Entity.Internal.RetryAction _4(InternalContext c)上的1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action类型entityType)在System.Data System.Data.Entity.Internal.LazyInternalContext.InitializeDatabase() 1.PerformAction(TInput input) at System.Data.Entity.Internal.LazyInternalContext.InitializeDatabaseAction(Action 1操作) .Entity.Internal.Linq.InternalSet 1.Initialize() at System.Data.Entity.Internal.Linq.InternalSet 1.Include(String path)在System.Data.Entity.Infrastructure.DbQuery 1.Include(String path) at System.Data.Entity.QueryableExtensions.Include[T](IQueryable 在Microsoft.AspNet.Identity.EntityFramework.UserStore 6.GetUserAggregateAsync(Expression 1过滤器)at System.Data.Entity.QueryableExtensions.Include [T,TProperty](IQueryable 1 source, Expression 1 path) Microsoft.AspNet.Identity.EntityFramework.UserStore 6.FindByNameAsync(String userName) at Microsoft.AspNet.Identity.UserManager 2.FindByNameAsync(String userName)at Microsoft.AspNet.Identity.UserManager`2.d_ 12.MoveNext() - - 从以前位置抛出异常的堆栈跟踪结束---在System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(任务任务)上的System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)在ControlPanel.Web.Controllers。 AccountController.d _2.MoveNext()在d:\ Projects \ FULL \ Control Panel \ ControlPanel.Web \ Controllers \ AccountController.cs中:第56行

起初我认为这可能是一个迁移问题,所以我完全删除了数据库,我重新启用了迁移,添加了Init迁移并更新了数据库

update-database -force -verbose

每一件事情顺利没有投诉,但是无论何时我尝试登录到我的网站我得到以前的错误,我做了大约10次迁移的事情,但无法解决问题..

这里是我的领域类(模型):

public class App
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int AppId { get; set; }
    //[Required]
    public virtual string FacebookId { get; set; }
    //[Required]
    public virtual string Secret { get; set; }      
    public virtual List<User> Users { get; set; }
    public virtual List<Post> Posts { get; set; }      
    //public virtual ApplicationUser Admin { get; set; }
}

public class Post
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int PostId { get; set; }
    public virtual string Content { get; set; }
    public virtual string Link { get; set; }
    public virtual string Image { get; set; }
    public virtual bool IsSpecial { get; set; }
    //[Required]
    public virtual App App { get; set; }
    //[Required]
    public virtual DateTime? PublishDate { get; set; }
}
public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public virtual int UserId { get; set; }

    [MaxLength(500)]
    public virtual string FacebookId { get; set; }

    [MaxLength(500)]
    public virtual string Token { get; set; }

    //[Required]
    public virtual App App { get; set; }
}

这里是我的IdentityModels:

public class ApplicationUser : IdentityUser
{
    public virtual List<App> Apps { get; set; }
    public bool? IsPremium { get; set; }
    [DataType(DataType.Date)]
    public DateTime? LastPublishDateTime { get; set; }
}

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("dCon")
    {
    }
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);
        modelBuilder.Entity<IdentityUser>().ToTable("Admins");
        modelBuilder.Entity<ApplicationUser>().ToTable("Admins");
        modelBuilder.Entity<IdentityUserRole>().ToTable("AdminRoles");
        modelBuilder.Entity<IdentityUserLogin>().ToTable("Logins");
        modelBuilder.Entity<IdentityUserClaim>().ToTable("Claims");
        modelBuilder.Entity<IdentityRole>().ToTable("Roles");
    }
}

从你的“数据库>系统表”中删除“[__MigrationHistory]”表将会正常工作。


从工具菜单中,单击NuGet程序包管理器,然后单击程序包管理器控制台(PMC)。 在PMC中输入以下命令。

启用迁移添加迁移初始化更新数据库运行应用程序。 解决问题的办法就是从这里开始


使用旧版productVersion删除[__MigrationHistory]表中的行为我工作。 这个答案适用于那些不想删除整个[__MigrationHistory]表的人。 只需在ProductVersion列中删除旧版本的行即可。 希望它有助于一个人!


删除所有表格标识

Delete _MigrationHistory
Delete AspNetRoles
Delete AspNetUserClaims
Delete AspNetUserLogins
Delete AspNetRoles
Delete AspNetUser

当您更改模型属性的数据注释时,可能会发生这种情况。 例如:将[必需的]添加到属性将导致数据库设计中的挂起更改。

最安全的解决方案是在包管理器控制台上运行:

add-migration myMirgrationName

这将显示Up()方法中的确切更改。 因此,您可以决定是否真的想要通过以下方式应用此类更改:

update-database

否则,您可能只需从__MigrationHistory表中删除最新的迁移,并从解决方案资源管理器的Migrations文件夹中删除。


当我正在开发时,我更喜欢使用这个实用的类来配置迁移。

希望能帮助到你。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
        this.Configuration.LazyLoadingEnabled = false;
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
        modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>();

        Database.SetInitializer(new Initializer());
    }

    public class Initializer : DropCreateDatabaseIfModelChanges<ApplicationDbContext>
    {
        public Initializer()
        {
            // TODO NOTHING, COMMENT ALL

            // IF CHANGES, RECREATE
            Database.SetInitializer(new DropCreateDatabaseIfModelChanges<ApplicationDbContext>());

            // CREATE ONLY NOT EXITS
            //Database.SetInitializer<Context>(new CreateDatabaseIfNotExists<ApplicationDbContext>());
        }

    }

    public System.Data.Entity.DbSet<.Models.Company> Companies { get; set; }

}

我刚刚通过删除网站文件夹中的所有文件,然后重新发布,解决了类似的问题。


我花了很多天的时间来解决这个问题,分析了许多不同的帖子,并尝试了很多选择, 最后修复。 这2个项目在我的解决方案中使用EF代码第一次迁移:

  • 控制台应用程序“DataModel”,主要使用包含所有我的代码第一个实体,DbContext,Mirgations和通用存储库的程序集。 为了能够从软件包管理器控制台生成迁移,我在该项目中包含了单独的空本地数据库文件(位于DataModel / App_Data文件夹中)。
  • WebApi,它引用DataModel项目并使用来自WebApi / App_Data文件夹的本地数据库文件,但未包含在项目中

请求WebApi时出现此错误...

我的环境:

  • Windows 8.1 x64
  • 带更新1的Visual Studio 2015 Professional
  • 我的所有项目都针对.NET Framework 4.6.1
  • 来自NuGet的EntityFramework 6.1.3

在这里,我收集了您应该注意的所有评论以及必须满足的所有条件/要求,以避免提到的异常情况:

  1. 您应该只对解决方案中的所有项目使用一个版本的EntityFramework Nuget包。
  2. 通过按顺序运行所有迁移脚本创建的数据库应该与目标数据库具有相同的结构/模式,并与实体模型相对应。 以下三件事必须完全相符/反映/匹配:
    • 您的所有迁移脚本持续到最后
    • 当前代码第一个实体模型的状态(DbContext,实体)
    • 目标数据库
  3. 目标数据库(mdf文件)应该更新/对应到最后一个迁移脚本。 验证目标数据库中的“__MigrationHistory”表是否包含您拥有的所有迁移脚本的记录,这意味着所有迁移脚本已成功应用于该数据库。 我建议您使用Visual Studio生成与数据库对应的正确的代码优先实体和上下文,Project - > Add New Item - > ADO.NET Entity Data Model - > Code First from database: 当然,作为替代方案,如果您没有数据库,则可以手动编写模型(代码优先实体和上下文),然后生成初始迁移和数据库。
  4. 连接字符串的名称例如启动项目的配置文件(Web.config / App.config)中的MyConnectionString

    <configuration>
      <connectionStrings>
        <add name="MyConnectionString" connectionString="...">
      </connectionStrings>
    <configuration>
    

    应该等于在你的DbContext的构造函数中传递的参数:

     public partial class MyDbContext : DbContext
     {
        public MyDbContext()
           : base("name=MyConnectionString"){}
        ...
    
  5. 在使用软件包管理器控制台之前,请确保您使用正确的数据库进行更新或生成迁移,并将需要的项目设置为解决方案的启动项目。 为了连接到数据库,它将使用该.config文件中的连接字符串,该文件在项目中设置为启动项目。
  6. 和主,这解决了我的问题:这是奇怪的,但在我的WebApi / bin文件夹DataModel.exe是旧的,没有刷新自上次构建。 由于迁移嵌入在我的程序集DataModel.exe中,因此我的WebApi使用旧的镜像更新了数据库。 我很困惑为什么在更新WebApi中的数据库后,它不对应于DataModel中的最新迁移脚本。 以下代码自动创建(如果不存在)或更新到我的WebApi / App_Data文件夹中的最新迁移本地数据库。

       public class WebApiApplication : System.Web.HttpApplication
       {
           protected void Application_Start()
           {
               Database.SetInitializer(new MigrateDatabaseToLatestVersion<ODS_DbContext, Configuration>()); 
               ...
    

    我尝试了干净和重建解决方案,但它没有帮助,比我完全从WebApi中删除bin和obj文件夹,从WebApi / App_Data中删除数据库文件,构建,重新启动WebApi,向它发出请求,它创建了正确的数据库 - 上面的行),对应于最新的迁移和异常没有出现更多。 所以,这可能会解决您的问题:

    1. 从你的启动项目中手动删除bin,obj文件夹 (它会生成/更新你的数据库)
    2. 建立你的启动项目或更好地清理和重建你的解决方案。
    3. 通过启动项目重新创建数据库(将执行上面的行)或使用软件包管理器控制台“update-database”命令。
    4. 手动检查生成的数据库和__MirgationHistory是否对应于最新的迁移脚本。

这对我有用 - 不需要其他更改。

DELETE FROM [dbo].[__MigrationHistory]

这是一个奇怪的错误,这不是我最后的错误,这是微软的,我安装了实体框架的“预发布”版本,它是这个错误的原因,当我升级到稳定释放它消失,谢谢大家相信我,当我问这个问题,我搜索了一个星期左右的解决方案,所以我非常确定,这个问题不是其他地方:实体framework.dll的版本,导致如果有帮助,问题是6.0.2。





asp.net-mvc-5