Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.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# DbContext破坏附加的实体:为什么?_C#_.net_Entity Framework - Fatal编程技术网

C# DbContext破坏附加的实体:为什么?

C# DbContext破坏附加的实体:为什么?,c#,.net,entity-framework,C#,.net,Entity Framework,我有一些这样的代码: Activity[] GetAllActivities() { using (ScheduleContext ctx = new ScheduleContext()) return ctx.Activities.AsNoTracking().ToArray(); } 其目的是为一些数据提供一个非常简单的内存缓存:活动映射到一个db视图,该视图汇总了我需要的所有内容 如果我省略AsNoTracking返回的对象是非确定性损坏的:返回对象上的属性设置不正确,并且一

我有一些这样的代码:

Activity[] GetAllActivities() {
  using (ScheduleContext ctx = new ScheduleContext())
    return ctx.Activities.AsNoTracking().ToArray();
}
其目的是为一些数据提供一个非常简单的内存缓存:
活动
映射到一个db视图,该视图汇总了我需要的所有内容

如果我省略
AsNoTracking
返回的对象是非确定性损坏的:返回对象上的属性设置不正确,并且一个对象的属性值经常与其他对象的属性值重复。没有任何警告或例外;既不在EF4.3.1上,也不在EF5rc2上。CLR 4和4.5候选发行版表现出相同的行为

活动
对象非常简单;仅由基本类型的非虚拟属性(
int
string
等)组成,与任何其他实体没有键或关系

这是预期的行为吗?我在哪里可以找到有关此的文档

我明白,一旦相关的
DbContext
消失,显然更改跟踪就无法工作,但我很惊讶具体化的属性在没有警告的情况下被破坏了。我最担心的是,在更复杂的场景中,我会忘记
AsNoTracking
,并得到一些似是而非但错误的结果

编辑:实体如下所示。谢谢乔纳森和克里斯托夫;确实有一列被推断为ID

public class Activity
{
  public string ActivityHostKey { get; set; }
  public int ActivityDuration { get; set; }
  public int ActivityLastedChanged { get; set; }
  public string ActivityId { get; set; }//!!!
  public string ModuleHostKey { get; set; }
  public string ModuleName { get; set; }
...
我认为“一个对象的属性值经常在其他对象的属性中重复”,而
活动
对象“没有键”是这里的关键信息(没有双关语)

导入视图(显然没有主键)时,EF猜测主键是什么。如果随后启用了跟踪,它将使用该主键确保在内存中只创建每个实体的一个副本。这意味着,如果加载两行,其中EF猜测为PK的字段值相同,则第二行的值将覆盖第一行

至于“非确定性损坏”的数据,这可能是因为数据库不保证返回行的顺序,而且在EF中是“最后一个wins”过程,因此如果记录的顺序从数据库中更改,则保留其值的记录也会更改


尝试将更多列标记为主键的一部分,或修改视图(或EDMX中的DefiningQuery)以包含基于的列,以便可以将其用作主键。

是否可以发布活动实体的代码和映射?你说活动对象很简单,没有键。他们没有主键?没有主键,没有外键:这只是一个直接转储DB视图以缓存常用信息。我会检查是否可以发布实体,但这真的很琐碎。嗯。。。你的问题让我想。。。主键可能被推断出来了,这是错误的。是的,据我所知,所有实体都需要一个键。如果没有定义,EF将尝试推断使用哪个字段作为键。你是对的:PK是推断出来的!你说得对:顺序确实是不确定的;这几乎肯定是重复数据消除导致EF覆盖属性值的原因。