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-Migration
和Update-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”的主要内容,如果未能解决你的问题,请参考以下文章