gpt4 book ai didi

c# - EF 4.0 - 加载导航属性的导航属性

转载 作者:行者123 更新时间:2023-11-30 17:21:15 25 4
gpt4 key购买 nike

我正在尝试从我的上下文中执行 LoadProperty 操作以加载导航属性的导航属性。

我的设置是我有一个 EntityA,其中包含一个 EntityB 的列表,每个 EntityB 都包含一个 EntityC 的列表。我正在以编程方式执行以下操作:

public virtual List<T> LoadProperty(List<T> entities, string property)
{
using (MyContext context = new MyContext())
foreach (T entity in entities)
{
context.AttachTo(typeof(T).Name, entity);
context.LoadProperty(entity, property);
}

return entities;
}

我这样调用它:

LoadProperty(entityA, "EntityB.EntityC");

我知道 NavigationProperty 路径是正确的,但是,这不起作用。有没有办法让它加载?

编辑:使用包含的工作示例:

using (MyContext context = new MyContext())
{
var query = from entityA in context.EntityA.Include("EntityB").Include("EntityB.EntityC")
where entityA.Id == id
select entityA;

return query.ToList();
}

最佳答案

首先,您的方法调用 context.AttachTo(typeof(T).Name, entity) 不正确,您将得到 InvalidOperationException。 ObjectContext.AttachTo Method显示:

public void AttachTo(string entitySetName, Object entity)

因此我们需要传递 EntitySet 名称而不是实体名称本身。但好消息是,我们可以通过实体名称从 MetadataWorkspace 获取 EntitySet 名称。下面的代码显示了如何。

现在,如果您有 3 层对象组合,并且 EntityB 和 EntityC 是 EntityCollections 类型的导航属性,那么我认为您不能通过一次调用 LoadProperty 来加载它们,但您可以通过两次调用 LoadProperty 来完成,这是如何完成的:

using System.Data.Metadata.Edm;

public virtual List<T> LoadProperty(List<T> entities, string property) {
using (TrialsContext context = new TrialsContext()) {

EntityContainer container = context.MetadataWorkspace
.GetEntityContainer(context.DefaultContainerName,
DataSpace.CSpace);
EntitySetBase entitySet = container.BaseEntitySets
.Where(item =>
item.ElementType.Name.Equals(typeof(T).Name))
.FirstOrDefault();

foreach (T entity in entities) {
context.AttachTo(entitySet.Name, entity);
context.LoadProperty(entity, property);
}

return entities;
}

你会称它为:


// To load EntityA Nav property:
LoadProperty(entityB, "EntityA");

// To Load EntityC Nav property:
//Let's assume the nav property name for EntityC on EntityB is EntityCList
LoadProperty(entityB, "EntityCList");

这样您将构建完整的对象图。

关于c# - EF 4.0 - 加载导航属性的导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3619873/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com