繁体   English   中英

如何在实体框架中创建只读实体?

[英]How do I create a read only entity in the entity framework?

我正在使用ADO.NET MVC和实体框架从数据库中加载相关实体的图形。 其中一个实体需要在内存中进行修改,但是当图中的其他实体发生更改时,这些更改就不会持久化回数据库。

目前,我尝试使用MergeOption.NoTracking和MergeOption.OverwriteChanges,但它们似乎都被忽略了,并且实体集中的任何不应该修改的更改都将持久保存到存储中。

下面给出了用于从数据库加载实体图的代码片段:

QuizDBEntities entities = new QuizDBEntities();
ObjectParameter[] searchParameters = { new ObjectParameter("contestantID", contestantID) };
entities.QuestionSet.MergeOption = MergeOption.NoTracking;

var query = entities.ContestantSet
  .Include("Quiz.Questions.Categories.Options.Answer")
  .Include("Answers")
  .Include("Quiz.Questions.Filters.FilterAnswers")
  .Where("it.ContestantID == @constestantID", searchParameters);

Contestant contestant = query.First();

我还尝试在构造查询之后但执行之前设置MergeOption。

任何帮助将不胜感激。

您遇到的问题的本质在于EF处理关系的方式。 在EF中,关系是实体的一等成员。 这就是为什么您要检索的对象图实际上是实体和关系的集合。 对象上下文内部的所有实体和关系都连接到对象上下文,或者断开连接。 那就是实体框架的“白金规则”

当我第一次注意到即使没有在代码中明确要求将实体附加到ObjectContext时,我还是有些吃惊,因为我相信实体框架不会破坏我所认为的“黄金法则”:也就是说,它不会做我没有明确要求做的任何事情。 一旦我理解了为什么在将实体附加到图形时将实体自动附加到上下文的原因以及为什么这样做是必要的,我就确定这必须是实体框架的白金规则,因为它否决了黄金规则。

Juile Lerman,编程实体框架

“黄金法则”说,EF永远不会做您未明确要求做的事情。

因此,“只读”实体是分离实体。 您可以像以前一样实现它。 或者,如果您在ObjectContext上调用Detach方法。 对象图中的实体可以附加或与ObjectContext分离。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM