【问题标题】:Invalid Column name when using savechanges() in entity framework在实体框架中使用 savechanges() 时列名无效
【发布时间】:2016-09-20 08:10:28
【问题描述】:

这就是交易,我已经更改了我的数据库架构,并更改了我的一个表的 PK,并且我已经删除了与旧 PK 相关的所有内容(另一个表中的 FK 引用)。

但是,当我使用 savechanges() 方法插入新实体时出现此异常

ex = {"更新条目时发生错误。有关详细信息,请参阅内部异常。"}

内部异常是

InnerException = {"无效的列名'Audit_ID'。"}

Audit_ID 是旧的 PK。

我试过这个 "Invalid column name" when trying to insert data into database using SQL

这个Invalid column name when trying to add an entity to a database using DbContext

这个Invalid column name after mapping

并没有解决我的问题,所以当我删除了我的整个 edmx 并创建了一个新的时,它也没有用。

ps:我使用的是数据库优先方法

【问题讨论】:

  • 你能把savechanges() ef query 也显示出来吗?
  • 通常删除旧 PK 并添加新 PK 需要在数据库优先方法上更新模型。如果您已删除旧 Audit_ID PK 的所有 FK 引用,则在模型类中您可以设置 KeyAttribute 为数据库集分配新的 PK。

标签: sql-server asp.net-mvc entity-framework entity-framework-6 ef-database-first


【解决方案1】:

所有解决方案均无效,因为问题实际上出在 SQL Server 数据库中。

我运行 SQL Profiler 并执行程序插入语句,我发现错误出在表的触发器之一中,该触发器具有 Previous 列名称,将其更改为新的 PK,它终于起作用了。

因此,如果有人遇到类似问题,帖子中的上述链接可能会有所帮助,或者您应该检查问题是否真的发生在数据库服务器上。

【讨论】:

  • 天哪,我欠你一杯啤酒。我一直试图找到这个问题将近 12 个工作小时。原来之前的开发人员已经为表编写了一个触发器。你把我带到了那里,我真的很感激。赞一个!
【解决方案2】:

从 ef 模型中删除/删除表(确保通过查看模型浏览器视图将其删除)。

重建解决方案。

确保您的表格已保存。检查您的连接字符串以及您引用的数据库是否正确。

通过更新模型工具再次添加表。

编辑:更好地阅读问题

【讨论】:

  • 这不太可能。 ef 上还有外键连接吗?
  • 如何让事情变得更糟?
  • 重新添加表时,它没有添加到 dbcontext。我手动将表添加到 dbcontext 但整个解决方案给了我一个错误
【解决方案3】:

创建您自己的 ModelKeyBuilder 类。

class MyOwnModelKeyBuilder
{

    public static void BuildCompositeKeys(DbModelBuilder modelBuilder)
    {
       modelBuilder.Entity<YourEntity>()
       .Ignore(x=>x.Audit_ID)
       .HasKey(x=>x.NewPrimaryKey);
    }
}

在你的 Model.Context.cs 中

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
     MyOwnModelKeyBuilder.BuildCompositeKeys(modelBuilder); 
}

这可能不是一个直接的解决方案,因为我不知道表格结构,但它可能会对您有所帮助。

【讨论】:

    【解决方案4】:

    在可能的情况下,我们发现在上下文中定义数据库元素可以解决问题。

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
            {
                modelBuilder.HasDefaultSchema("database_schema");
                modelBuilder.Entity<EntityNameInModel>().ToTable("table_in_database").HasKey(ats => ats.id);
                modelBuilder.Entity<EntityNameInModel>().Property(ats => ats.user_name).HasColumnName("user_name");
    }
    

    您将需要以这种方式定义每个架构、表和字段...但之后您将拥有对代码的绝对控制权。祝你好运!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-28
      • 2012-08-24
      相关资源
      最近更新 更多