在 entity framework 中使用 savechanges() 时列名无效

Invalid Column name when using savechanges() in entity framework

事情就是这样,我更改了我的数据库模式,并更改了我的一个表的 PK,我删除了与旧 PK 相关的所有内容(另一个表中的 FK 引用)。

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

ex = {"An error occurred while updating the entries. See the inner exception for details."}

内部异常是

InnerException = {"Invalid column name 'Audit_ID'."}

Audit_ID就是老PK了。

我试过了

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

这个Invalid column name after mapping

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

ps:我正在使用数据库优先方法

Remove/Delete 来自 ef 模型的 table(确保通过查看模型浏览器视图将其删除)。

重建解决方案。

确保您的 table 已保存。还要检查您的连接字符串是否引用了正确的数据库。

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

编辑:更好地阅读问题

创建您自己的 ModelKeyBuilder class。

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

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

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

我 运行 SQL Profiler 并执行了程序插入语句,我发现错误出在 table 的触发器之一,它具有上一列名称,将其更改为新的 PK,它终于奏效了。

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

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

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

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