C# 实体框架-包含/引用/收集
我想知道为什么有不同的方法来填充导航属性 如果我处理整个集合,我可以对属性或集合调用C# 实体框架-包含/引用/收集,c#,entity-framework,navigation-properties,C#,Entity Framework,Navigation Properties,我想知道为什么有不同的方法来填充导航属性 如果我处理整个集合,我可以对属性或集合调用Include 但是,如果我处理单个实体,则根据项目是集合(collection)还是单个引用(reference),可以调用两种不同的方法 有没有办法解决这个问题?这使事情变得比我认为必要的更复杂。有人能解释一下为什么在设计EF的时候会做出这样的决定吗 编辑 进一步研究,问题会更加严重。我试图做的是创建一种通用方法,在单个实体上加载集合/导航属性。使用Include可以很容易地完成整个集合。但是Referenc
Include
但是,如果我处理单个实体,则根据项目是集合(collection
)还是单个引用(reference
),可以调用两种不同的方法
有没有办法解决这个问题?这使事情变得比我认为必要的更复杂。有人能解释一下为什么在设计EF的时候会做出这样的决定吗
编辑
进一步研究,问题会更加严重。我试图做的是创建一种通用方法,在单个实体上加载集合/导航属性。使用Include可以很容易地完成整个集合。但是Reference
和Collection
的方法签名略有不同
没关系,我得把这些电话分散在我的应用程序上
e、 g
Include()
方法的唯一目的是在查询时显式地加载相关数据
另一方面,Entry()
方法旨在为您提供对附加到上下文的实体的当前状态的特定控制,而不仅仅是Load()
相关数据
这就是为什么您必须在Collection
、Reference
和Property
方法之间进行显式选择的原因,每个方法都公开不同的功能集(因此返回不同的类型)
例如:
- Scalar(
)包含DbPropertyEntry
属性,该属性表示值是否从“x”更改为“y”(例如)IsModified
- Reference(
)包含DbReferenceEntry
属性,该属性表示引用的数据是否已从数据库加载IsLoaded
- 参考集合(
)源于DbCollectionEntry
(因此ICollection
),这意味着您可以迭代其数据。但是,它不能包含IEnumerable
属性,因为集合中的每个项都可能不同IsModified
Load()
感兴趣,则可以利用多态Member()
方法(该方法返回DbMemberEntry
,这是上述所有类型的基本类型),并检查条目是否“可加载”:
您可以这样做: 1.-加载实体,包括集合:
MyClass myObject = dbContext.MyClasses
.Include(cls => cls.ObjectCollection)
.Single(cls => cls.Pk == entityPk);
2.-然后必须检索该对象条目,并告诉EF在集合对象中加载所需的属性:
dbContext.Entry(myObject).Collection("ObjectCollection").Query().Include("ReferenceClass").Load();
进一步阅读:
您还可以使用Select加载引用的集合
db.MyObject.Include(x => x.RefObect.Select(y => y.RefRefObject));
想解释一下我如何能把这个问题做得更好吗?我没有投票结束,但我确实发现第一次理解这个问题很困难。也许值得为收集/引用添加一些示例代码,然后在引用您希望实现的调用示例时?我假设“处理单个实体”的意思是使用
context.Entry(entity.Collection(“Collection”).Load()
method?@Simon-您可以通过向我们展示您的尝试来改进这一点,您遇到的错误和询问的具体问题。投票结束是因为S/O更多地针对有具体答案的问题,例如“为什么此代码不起作用?/因为您忘记使用X参数”。S/O特别不鼓励会引起广泛讨论的问题(例如“他们在设计feature X时是怎么想的”)——不是因为它们不是一个有趣和有用的问题,而是因为S/O不是为此而设计的。试着在一个与计算机科学相关的堆栈交换网站上提问:)谢谢@haim770-成员功能可能会有所帮助!谢谢这真的很有帮助。
MyClass myObject = dbContext.MyClasses
.Include(cls => cls.ObjectCollection)
.Single(cls => cls.Pk == entityPk);
dbContext.Entry(myObject).Collection("ObjectCollection").Query().Include("ReferenceClass").Load();
db.MyObject.Include(x => x.RefObect.Select(y => y.RefRefObject));