System.Data.Entity.Core.EntityCommandExecutionException 和内部异常 SqlException:无效的列名“xxxx”

Posted

技术标签:

【中文标题】System.Data.Entity.Core.EntityCommandExecutionException 和内部异常 SqlException:无效的列名“xxxx”【英文标题】:System.Data.Entity.Core.EntityCommandExecutionException and Inner Exception SqlException: Invalid column name 'xxxx' 【发布时间】:2020-12-24 08:52:09 【问题描述】:

这是关于尝试从数据库中将值提取到 Datagrid 时出现的异常。

当我尝试运行应用程序时,我收到了下面提到的错误,

System.Data.Entity.Core.EntityCommandExecutionException:执行命令定义时出错。有关详细信息,请参阅内部异常。

内部异常 SqlException:列名“AssetClass_Id”无效。

从迁移更新数据库时,上面提到的外键列AssetClass_Id 已被修改为AssetClassId。数据库在设计中也将其列值显示为AssetClassId

这是我的AssetType 课程代码:

    public int Id  get; set; 

    [Required]
    [StringLength(50)]
    public string Name  get; set; 

    [StringLength(100)]
    public string Description  get; set; 

    public AssetClass AssetClass  get; set; 

这是我在表单加载方法下编写的.cs文件代码:

using (CapexDbContext db = new CapexDbContext())

    // Load data to grdAssetType
    assetTypeBindingSource.DataSource = db.AssetTypes.ToList();
    AssetType obj = assetTypeBindingSource.Current as AssetType;
    panelAssetType.Enabled = false;

    // Load data to cmbAssetClasses
    var assetClass_ = from AssetClass in db.AssetClasses
                      select AssetClass;

    cmbAssetClass.DataSource = assetClass_.ToList();
    cmbAssetClass.DisplayMember = "Name";
    cmbAssetClass.ValueMember = "Id";

尝试将数据提取到 dataGrid 时来自该行的异常:

assetTypeBindingSource.DataSource = db.AssetTypes.ToList();

另外这里是我最新的迁移代码:

         CreateTable(
            "dbo.AssetClasses",
            c => new
                
                    Id = c.Int(nullable: false, identity: true),
                    Code = c.String(nullable: false, maxLength: 10),
                    Name = c.String(nullable: false, maxLength: 100),
                    Lifetime = c.Int(nullable: false),
                    Rate = c.Single(nullable: false),
                )
            .PrimaryKey(t => t.Id);
        
        CreateTable(
            "dbo.AssetTypes",
            c => new
                
                    Id = c.Int(nullable: false, identity: true),
                    Name = c.String(nullable: false, maxLength: 50),
                    Description = c.String(maxLength: 100),
                    AssetClassId = c.Int(nullable: false),
                )
            .PrimaryKey(t => t.Id)
            .ForeignKey("dbo.AssetClasses", t => t.AssetClassId)
            .Index(t => t.AssetClassId);

运行数据库表:AssetTypes & AssetClass(引用表)

【问题讨论】:

可能你的数据库没有更新为你的模型。使用Add-MigrationUpdate-Database 命令。 【参考方案1】:

尝试查看项目中的 DBcontext,尝试查看它在实体定义中的说明,尤其是在这部分:

protected override void OnModelCreating(ModelBuilder modelBuilder)

    base.OnModelCreating(modelBuilder);
    //modelBuilder.Entity<IdentityUser>().ToTable("user");
    
    
    modelBuilder.Entity<ApplicationUser>(entity =>
    
        entity.ToTable("user");
        entity.Property(e => e.CreationAtDate)
        .HasColumnName("created_at") //<------ THIS ONE
        .HasDefaultValueSql("(getDate())");
    );

【讨论】:

我的 DBContext 没有任何 OnModelCreating 方法...... 我认为即使迁移也需要 OnModelCreating,但可能并非如此。可以分享一下正在运行的数据库中的表格截图吗? 尝试搭建数据库:docs.microsoft.com/en-us/ef/core/managing-schemas/…【参考方案2】:

我注意到您的 AssetType 类包含 AssetClass 属性。

同时,您数据库中的表包含AssetClassId 字段。

它们是不同的。

因此,我们应该在AssetType类中定义类。

 public class AssetType
    
        public int Id  get; set; 

        [Required]
        [StringLength(50)]
        public string Name  get; set; 

        [StringLength(100)]
        public string Description  get; set; 

        public int AssetClassID  get; set;     // We need to modify it here
    

然后,我们需要在包管理器控制台中执行更新数据库的命令。

PM> Add-Migration Modify

PM> Update-Database

最后,我们可以使用以下代码在datagirdview中显示数据。

private void Form1_Load(object sender, EventArgs e)
        
            using (var db = new MyContext())
            

                var type = new AssetType  Id = 1001, Description = "test1", Name = "name1", AssetClassID=123456 ;
                db.Types.Add(type);
                db.SaveChanges();
                dataGridView1.DataSource = db.AssetTypes.ToList();
              
            
        

结果:

【讨论】:

以上是关于System.Data.Entity.Core.EntityCommandExecutionException 和内部异常 SqlException:无效的列名“xxxx”的主要内容,如果未能解决你的问题,请参考以下文章