在 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 和字段...但之后您将拥有对代码的绝对控制权。祝你好运!
事情就是这样,我更改了我的数据库模式,并更改了我的一个表的 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 和字段...但之后您将拥有对代码的绝对控制权。祝你好运!