迁移后与数据库 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
这是迁移为我生成的代码:
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