在实体框架中使用savechanges()时,列名无效

时间:2016-09-20 08:10:28

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

所以这是交易,我更改了我的数据库架构,并更改了我的一个表的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并创建一个新的edmx时,它也没有解决。

ps:我正在使用数据库第一种方法

4 个答案:

答案 0 :(得分:5)

非解决方案有效,因为问题实际上是在SQL Server数据库中。

我运行了SQL事件探查器并执行了程序插入语句,我发现该错误位于表的触发器之一,该触发器具有Previous列名,将其更改为新PK并最终起作用。

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

答案 1 :(得分:0)

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

重建解决方案。

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

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

编辑:更好地阅读问题

答案 2 :(得分:0)

创建自己的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); 
}

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

答案 3 :(得分:0)

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

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");
}

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