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

时间:2009-10-17 04:10:14

标签: c# entity-framework

我使用ADO.NET MVC和Entity Framework从数据库加载相关实体的图形。其中一个实体需要在内存中进行修改,但在图表中的其他实体发生更改时,不会将更改保留回数据库。

此时我尝试使用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。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

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

  

当我第一次注意到一个实体已附加到ObjectContext时,即使我没有在我的代码中明确地调用它,我有点吃惊,因为我相信实体框架不会破坏我的想法作为“黄金法则”:也就是说,它没有做任何我没有具体告诉它做的事情。一旦我理解为什么实体在我将它们附加到图形时自动附加到上下文 - 以及为什么这是必要的 - 我确定这必须是实体框架的铂金规则,因为它推翻了黄金法则。

Juile Lerman,编程实体框架

“黄金法则”表示EF永远不会做你没有明确告诉它做的事情。

因此,“只读”实体是分离实体。你可以按照自己的方式实现它。或者如果在ObjectContext上调用Detach方法。对象图中的实体可以与ObjectContext分离连接。