迁移后与数据库 table 和键名冲突。 Asp.NetMVC 5 EF 6

Conflict with database table and key names after migration. Asp.Net MVC 5 EF 6

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

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",键为 "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);

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

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

如您的异常详细信息所示:

System.Data.SqlClient.SqlException: Invalid object name 'dbo.ApplicationUserProjects'

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

假设代码优先迁移到位,因为您已经创建了具有不同主键索引名称的 ProjectUsers table,在重写的 OnModelCreating 方法中创建适当的 table 映射:

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

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

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

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

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

Same thing happens when I undo the change for the Database name but keep my own names for they keys.

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

相关问题:

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