Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/283.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# 实体框架-包含/引用/收集_C#_Entity Framework_Navigation Properties - Fatal编程技术网

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
    )包含
    IsModified
    属性,该属性表示值是否从“x”更改为“y”(例如)

  • 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));