【问题标题】:Conflict with database table and key names after migration. Asp.Net MVC 5 EF 6迁移后与数据库表和键名冲突。 ASP.NET MVC 5 EF 6
【发布时间】:2016-09-27 21:29:44
【问题描述】:

这是迁移为我生成的代码:

public override void Up()
    {
        CreateTable(
            "dbo.ApplicationUserProjects",
            c => new
                {
                    ApplicationUser_Id = c.String(nullable: false, maxLength: 128),
                    Project_ID = c.Int(nullable: false),
                })
            .PrimaryKey(t => new { t.ApplicationUser_Id, t.Project_ID })
            .ForeignKey("dbo.AspNetUsers", t => t.ApplicationUser_Id, cascadeDelete: true)
            .ForeignKey("dbo.ProjectTbl", t => t.Project_ID, cascadeDelete: true)
            .Index(t => t.ApplicationUser_Id)
            .Index(t => t.Project_ID);

    }

我将数据库名称更改为我更喜欢的名称,以及键名(列名)。示例数据库名称为“ProjectUsers”,Keys 为“ProjectID”和“UserID”。所以新代码如下所示:

CreateTable(
            "dbo.ProjectUsers",
            c => new
                {

                    ProjectID = c.Int(nullable: false),
                    UserId = c.String(nullable: false, maxLength: 128),
                })
            .PrimaryKey(t => new { t.ProjectID, t.UserId })
            .ForeignKey("dbo.ProjectTbl", t => t.ProjectID, cascadeDelete: true)
            .ForeignKey("dbo.AspNetUsers", t => t.UserId, cascadeDelete: true)
            .Index(t => t.ProjectID)
            .Index(t => t.UserId);

我通过运行迁移更新来更新数据库,表和所有内容都是使用我为数据库和键提供的名称创建的。但是当我导航到页面时,它说: 当我撤消对数据库名称的更改但保留我自己的名称作为它们的键时,也会发生同样的事情。

那么为什么会发生这种情况,不希望应用使用新名称的幕后发生了什么?

【问题讨论】:

    标签: asp.net-mvc entity-framework-6 asp.net-identity-2 entity-framework-migrations


    【解决方案1】:

    如您的异常详情所示:

    System.Data.SqlClient.SqlException:对象名称无效 'dbo.ApplicationUserProjects'

    EF 尝试将 LINQ 查询语句转换为 SQL 等效语句,该语句使用名为 ApplicationUserProjects 的对象(假设是一个表),但相应的对象在您的数据库中不存在,因为它没有被迁移。

    假设代码优先迁移,因为您已经创建了具有不同主键索引名称的 ProjectUsers 表,所以在覆盖的 OnModelCreating 方法中创建正确的表映射:

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ProjectUsers>().ToTable("ProjectUsers");
    }
    

    然后,将与ApplicationUserProjects 相关的所有引用更改为ProjectUsers 表,包括您的模型(如果有)(例如,如果您的表属性指向ApplicationUserProjects,则更改为ProjectUsers)。

    [Table("ProjectUsers")]
    public class ProjectUsers
    {
        // entity members
    }
    

    请注意,上述这些操作最好在迁移开始之前完成,因为您应该避免修改自动生成的迁移文件。

    您的问题陈述也支持主键问题:

    当我撤消对数据库名称的更改时会发生同样的事情,但是 为他们的钥匙保留我自己的名字。

    恕我直言,EF 模型类使用创建数据库时定义的指定主键索引,用您自己的主键字段名称替换原始 PK 字段,它不再匹配表到模型的关系,因此返回相同的异常。

    相关问题:

    Entity Framework throws exception - Invalid object name 'dbo.BaseCs'

    Entity Framework code first seems confused on my dbo table names after I tweaked the migration file

    【讨论】:

    • 创建的表是导航表。我为每个模型设置了外部属性,添加了迁移,进行了更改,运行了 update-migration 命令,一切都按照我想要的方式创建。但是后来错误出来了
    猜你喜欢
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2015-05-31
    • 2017-01-24
    • 1970-01-01
    • 2019-08-27
    • 2019-06-15
    相关资源
    最近更新 更多