C# EF 6调用INSERT而不是UPDATE
这可能是一个重复的问题,但大量搜索标题中的单词只能得到许多不相关的结果 我有一个实体大致如下:C# EF 6调用INSERT而不是UPDATE,c#,.net,sql-server,entity-framework,entity-framework-6,C#,.net,Sql Server,Entity Framework,Entity Framework 6,这可能是一个重复的问题,但大量搜索标题中的单词只能得到许多不相关的结果 我有一个实体大致如下: public abstract class A { public GUID AId { get; set; } public string SomeProperty { get; set; } } public class B : A { public string SomeOtherProperty { get; set; } } 对于B对象,上下文具有public D
public abstract class A
{
public GUID AId { get; set; }
public string SomeProperty { get; set; }
}
public class B : A
{
public string SomeOtherProperty { get; set; }
}
对于B
对象,上下文具有public DbSet BInstances{get;set;}
。在OnModelCreating
中,映射将A
设置为忽略,并且B
映射到名为TableB
的表
AId
字段不是自动生成的(不是标识字段),但在数据库和映射中都设置为主键。在数据库中,该字段被定义为非空唯一标识符
,没有默认值
在运行时,我使用其键加载B
的一个实例(\u token
只是一个取消token
):
然后,设置了b
属性,我尝试将其保存回数据库:
b.SomeOtherProperty = "some new text";
await (dbCtx.SaveChangesAsync(_token));
此时,我从数据库中得到了一个违反主键约束的错误,指出不能插入AId
的值,因为它是重复的。当然,ID已经在数据库中了,我使用ID从那里加载了实体。出于某种原因,EF生成了一个INSERT语句,而不是UPDATE,我不明白为什么
当我检查dbCtx.Entry(b).State
时,它已经设置为EntityState.Modified
。我不知所措——有人能指出我做错了什么吗?我以前从未遇到过更新实体的问题,但我没有将EF与GUID主键一起使用(通常我使用long
主键)
我正在使用EF 6和.NET Framework 4.7.1。试试这个
b.SomeOtherProperty = "some new text";
dbCtx.BInstances.AddOrUpdate(b);
await (dbCtx.SaveChangesAsync(_token));
AddorUpdate将更新已添加的b实例 谢谢大家的建议-这是我造成的映射问题 在我的
OnModelCreating()
调用中,我对一个不是从基类继承的类型调用了MapInheritedProperties()
(当然不是object
),这似乎触发了一个问题。其他共享基类的实体可以很好地处理映射调用
我还直接针对实体类调用了ToTable()
——这破坏了我的表映射,原因我不明白。一旦我将该调用移到Map()
中,它就开始按预期工作
所以我从这里开始:
entity.ToTable("tablename");
为此:
entity.Map(m => m.ToTable("tablename"));
解决这个问题
希望这对未来的读者有用。如果你能分享一个故事,那就太棒了。出现这种情况的原因有很多,完整的端到端示例将为我们指明正确的方向。@mjwills我会尝试,但只能在早上进行(这里是深夜)。我的真实代码有点长,并且在保密协议下,所以我必须把一些东西放在一起。我花了4-5个小时试图理解它失败的原因。你能在
OnModelCreating
方法中发布你是如何定义实体B
映射的吗?@user1672994我会在早上发布它-我需要睡一觉,我只是在最后一次检查。我不知道这个实体出了问题(除非代码中的某个地方实际将条目的状态设置为“已添加”),但导航属性也可能是提供程序的问题,但这不太可能。如果没有可验证的示例,这只是猜测。
entity.Map(m => m.ToTable("tablename"));