【问题标题】:Entity Framework Core: Table names are being mapped to include the namespaceEntity Framework Core:表名被映射以包含命名空间
【发布时间】:2016-06-13 22:45:01
【问题描述】:

我最近更新了一个 ASP.NET 5 项目以使用 ASP.NET Core (RC2) 和 Entity Framework Core。到目前为止,除了这里和那里的细微差别之外,一切都还好,但是在尝试更改我的一个表的名称后,我注意到我的迁移试图引用一个不正确的表(即“MyProject.Models.Blog”而不仅仅是“博客”)。

我浏览了一些文档并尝试了一些方法,例如使用数据注释。我的模型的设置类似于它们在文档中的设置(使用特定于我的项目的不同命名/数据,但想法相同):

public class MyContext : DbContext
{
    public DbSet<Blog> Blog { get; set; }
    public DbSet<Post> Posts { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        builder.Entity<Blog>();
        builder.Entity<Post>();
    }
}

public class Blog
{
    public int BlogId { get; set; }
    public string Url { get; set; }
}

public class Post
{
    public int PostId { get; set; }
    public string Title { get; set; }
    public string Content { get; set; }

    public int BlogId { get; set; }
    public Blog Blog { get; set; }
}

所以当我进行更改时,去创建一个新的迁移,并查看生成的迁移文件,我可以看到 migrationBuilder 现在正在尝试对“MyProject.Models.Post”表进行更改,而不是“Post”表,它曾经这样做过。在更新到 Core 之前,我已经进行了一些迁移,并且自更新以来我的模型没有改变任何东西,所以这是新行为。

编辑:我应该注意我目前在我的模型上使用“[Table("Post")]”数据注释,但这也无济于事。

编辑 2:这是我的迁移文件内容的链接(名称已更改)-http://pastebin.com/CZmXTBEM

【问题讨论】:

    标签: c# asp.net .net asp.net-mvc entity-framework


    【解决方案1】:

    如果您不想删除旧的迁移(如果您有现有的数据库,则可能不会),需要执行以下操作:

    1. 获取您的 pre-EF-core 代码快照
    2. 在您的模型类中,进行简单的虚拟更改,例如添加一个简单的属性
    3. 添加虚拟迁移dotnet ef migrations add dummy。这将创建迁移并重新生成快照。
    4. 在快照中,删除定义新创建列的代码。
    5. 删除迁移 .cs 文件,并恢复对模型的虚拟更改。

    就是这样:新添加的迁移将使用正确的表名。

    【讨论】:

      【解决方案2】:

      迁移似乎有些问题。

      在我的情况下,它可以按照您(和我)的预期工作 - 表的名称取自 DbSet 变量的名称(不是 RC1 中的类型),例如:

      • 对于public DbSet&lt;Blog&gt; Blog { get; set; } EF Core 在我的数据库中创建Blog 表,

      • 对于public DbSet&lt;Post&gt; Posts { get; set; } EF Core,在我的数据库中创建Posts 表。

      但是在我的情况下 - 我在安装 RC2 后创建了新的/干净的项目,我将我的代码移动到这个新项目......之后我创建了新的迁移......所以我创建了新的/干净的迁移在 RC2 上。

      我假设您在 RC1 上创建的迁移很少,并且您在将项目迁移到 RC2 后创建了新的迁移 - 也许这里有问题?


      你能告诉我你的迁移文件的代码吗?

      • 但是,请包含文件,不要在此处粘贴所有代码;)
      • 或者您可以使用您的代码提供存储库的链接。



      您也可以尝试类似的方法(它是其他问题的解决方案,但也可能对您的情况有所帮助 - 我没有测试过):

      foreach (var entity in modelBuilder.Model.GetEntityTypes())
      {
          entity.Relational().TableName = entity.DisplayName();
      }
      



      仍然 - 在我看来 - 这不是预期的情况。

      您可以在下面阅读更多关于从 RC1 迁移到 RC2 以及更改表命名的信息,但我没有发现任何关于这种行为的提及:

      【讨论】:

      • 感谢您的回复。我不知道如何附加文件,所以这里有一个指向内容的链接 - pastebin.com/CZmXTBEM。我将其中一些名称替换为“博客”和“帖子”。
      • 谢谢,但为什么I replaced the some of the names to "Blog" and "Post". ??我想查看所有迁移文件(未以任何方式修改)...
      • 没有足够的信息来弄清楚这一点,但是......您可以尝试删除所有迁移(先进行备份),然后在 RC2 上创建新的(干净的)迁移。
      • 删除旧的迁移(和快照)解决了这个问题。显然,迁移的生成方式发生了一些变化,如果仍然存在旧迁移,则会导致问题。
      【解决方案3】:

      删除旧迁移和旧快照解决了问题。

      【讨论】:

      • 太好了。我建议将此答案标记为已解决/解决方案 - 这将有助于将来的其他人;)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-01-21
      • 1970-01-01
      • 2016-10-23
      • 2016-04-27
      • 1970-01-01
      • 2016-09-26
      • 1970-01-01
      相关资源
      最近更新 更多