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覆盖属性值的原因。