迁移后与数据库表和键名冲突。 Asp.Net MVC 5 EF 6
这是代码迁移产生对我来说:迁移后与数据库表和键名冲突。 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);
我通过运行迁移更新,表更新数据库和一切变得与我给了数据库和密钥的名称创建。但是,当我导航到页面时,它会显示: 当我撤销数据库名称的更改但保留我自己的密钥名称时,会发生同样的情况。
那么,为什么会发生这种情况,幕后发生了什么不希望应用程序使用新名称?
随着你的异常详细信息显示:
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命令,一切都以我想要的方式创建。但是,那么错误出来了 – Arianit