为什么我的应用正在搜索不存在/不应该存在的表格?

时间:2016-03-29 18:48:33

标签: asp.net-mvc-5 migration entity-framework-5 ef-migrations

我创建了一个MVC应用程序,我在其中重命名了一个模型类来自" Diplomata"到#34;文凭"现在我无法进行迁移以创建一个名为" Diplomas"的桌子,因为他们仍然出于某种原因使用旧名称。 (使用.NET Framework 4.6和EntityFramework 6.1.2)

到目前为止我尝试过的事情:

  • 完全删除数据库表(从Visual Studio的SQL Server对象资源管理器中删除并手动删除文件)
  • 删除迁移文件夹并重新启用迁移
  • 删除模型并重新创建(删除迁移并完全删除表后)

再次启用迁移并使用命令" add-migration Initial"我得到一个脚本,生成一个名为" dbo.Diplomata"

的表格

这是模型

namespace DDS.Data.Models
{
    using System.Collections.Generic;
    using DDS.Data.Common.Models;

    public class Diploma : BaseModel<int>
    {
        public string Title { get; set; }

        public string Description { get; set; }

        public virtual ICollection<Tag> Tags { get; set; }
    }
}

这是ApplicationDbContext

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }
    ...
    public IDbSet<Diploma> Diplomas { get; set; }
    ...
}

这是自动生成的迁移脚本的一部分

public partial class Initial : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Diplomata",
            c => new
            {
                Id = c.Int(nullable: false, identity: true),
                Title = c.String(),
                Description = c.String(),
     ...
}

在VS2015中搜索&#34; Diplomata&#34;在整个解决方案中找不到任何东西。

添加重命名表的迁移会导致应用在更新后崩溃,因为它正在搜索具有旧名称的表。 (无效的对象名称&#39; dbo.Diplomata&#39;)

我一整天都在调试,没有任何结果,所以我们非常感谢任何有关寻找地点和寻找什么的想法或建议。

PS:这是我在这里的第一个问题所以,如果我错过了什么或者很难理解的东西请告诉我,谢谢

2 个答案:

答案 0 :(得分:0)

您是否尝试清理迁移表?启用迁移时,系统表称为&#34; __ MigrationHistory&#34;生成。您可以从SQL Server Management Studio中找到此类表。转到YourDatabase-&gt; Tables-&gt;系统表,它将会在那里。

迁移的工作方式如下:

  1. 使用指定名称生成初始迁移。
  2. 执行初始迁移。
  3. 当运行初始迁移和后续迁移时,更改将应用​​于数据库,并将其作为新行保存在__MigrationHIstory表中的数据库结构的快照应用于数据库。
  4. 当应用程序初始化时,EF将比较迁移表中的最新记录,并将该快照与可用的最新迁移进行比较,如果它们不匹配,则会抛出异常。这就是EF确定数据库是否发生变化的方式。
  5. 当您对原始模型进行更改时,您应该创建后续迁移文件,以便还原或应用数据库更改。如果您已经删除了初始迁移文件,那么最好的选择可能是清理__MigrationHistory表。 EF在表中生成唯一条目(我相信默认行为是迁移文件的名称+生成迁移时的时间戳)。您始终可以重命名初始迁移文件以与__MigrationHistory表中的名称匹配,并创建新的迁移以应用相关表的重命名。这仅在文件和模型的名称与数据库中的快照匹配时才有效,否则将抛出异常

    有关迁移的详细信息,请查看本文: http://tech.trailmax.info/2014/03/inside_of_ef_migrations/

    作为旁注,您还可以修改默认行为以及如何生成迁移历史记录表。如果您需要支持特定需求(例如重命名,不将其生成为系统表,添加其他列等),这可能会有所帮助。这在某些情况下会很有用。请检查以下链接(特别适用于基于云的数据库): How do I add an additional column to the __MigrationHistory table?

    注意:重要的是要提到初始模型或后续模型中未包含的表将从模型验证中排除。如果您想创建不应由EF监控的表,这将特别有用。 I.E:会员提供者表。

    我希望这有助于澄清你遇到的问题。

答案 1 :(得分:0)

经过几次试验和错误后,我放弃了解决问题的方法。相反,我强迫应用程序通过在模型上添加Table属性在一个具有我想要的名称的表中创建模型。所以现在模型看起来像这样:

[Table("Diplomas")]
public class Diploma : BaseModel<int>
{
    public string Title { get; set; }

    public string Description { get; set; }

    public virtual ICollection<Tag> Tags { get; set; }
}
相关问题