迁移后与数据库表和键名冲突。 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); 

我通过运行迁移更新,表更新数据库和一切变得与我给了数据库和密钥的名称创建。但是,当我导航到页面时,它会显示: enter image description here 当我撤销数据库名称的更改但保留我自己的密钥名称时,会发生同样的情况。

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

随着你的异常详细信息显示:

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

+0

时生成的表是一个导航台。我为每个模型设置了外部属性,添加一个迁移,进行更改,运行update-migration命令,一切都以我想要的方式创建。但是,那么错误出来了 – Arianit