Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF 6调用INSERT而不是UPDATE_C#_.net_Sql Server_Entity Framework_Entity Framework 6 - Fatal编程技术网

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