gpt4 book ai didi

c# - Entity Framework 检索导航属性

转载 作者:太空宇宙 更新时间:2023-11-03 11:10:39 26 4
gpt4 key购买 nike

我使用的是 EF 5,并且启用了延迟加载。当我从数据库中检索实体时,它工作得很好。

这是我的问题。我有一个通用存储库来执行数据库操作。

    public int Update(T t) //Update method implemented at repository layer
{
dbSet.Attach(t);
context.Entry(t).State = EntityState.Modified;
return context.SaveChanges();
}

public T Update(T t, int id) //This Method calls the above method to
{
if (Update(t) > 0)
{
//Now entity is updated so retrieve the entity from the database.
return Get(id); //This line of code doesn't return entity with reference. It does return the updated entity.
}
return null;
}

现在,当我使用主键查询实体以获取更新的实体时,它会为我提供更新的实体,但没有任何引用属性。我不能在这里使用延迟加载,因为它会抛出异常。

更新实体后,我注意到 dbSet.Local 有更新的实体。所以我在检索更新的实体之前尝试清除,但没有成功。我还尝试通过上下文重新加载实体,但它不会重新加载导航属性。我不能像使用通用存储库那样使用引用属性。我能完成的唯一方法是处置和创建上下文和 dbset 的新实例。

我想返回填充了关系属性的更新实体。有没有人有好的解决办法。

最佳答案

I have lazy loading enabled

I am attaching POCO entity

根据您的评论,我假设您在应用程序的某处像这样实例化您的实体 new MyEntity() 并且延迟加载将不起作用,因为它不是代理 POCO。

考虑到您说您启用了延迟加载,执行您想做的事情的最简单方法是使用代理 POCO。那就是使用下面的实例来实例化一个实体,无论它在哪里:

MyEntity entity = MyContext.MyEntities.Create();

延迟加载应该适合你。如果您不想这样做或这不起作用,那么最好的选择是从数据库中提取现有实体(作为动态代理)并从您的 POCO 中填充。所以在你的存储库更新方法中:

编辑

我应该指出,也可以在不往返数据库的情况下执行此操作。查看评论。

public T Update(T poco)
{
//get the entity from db
T proxyPoco = context.Set<T>().Find(id);

//alternatively just create the proxy, set the id and attach.
//no db retrieval.
//T proxyPoco = context.Set<T>.Create();
//proxyPoco.Id = poco.Id;
//context.Set<T>.Attach(proxyPoco);

if(proxyPoco == null)
{
//throw an exception or handle case where the entity is not found.
//unecessary if using alternative above.
}
else
{
//set the proxy poco values using your original poco
context.Entry<T>(proxyPoco).CurrentValues.SetValues(poco);
}
context.SaveChanges();
return proxyPoco;
}

因为您返回代理 POCO 延迟加载应该可以工作。其他不太理想的选择是:

  1. 丢弃上下文并重新获取实体。
  2. 使用反射显式加载该实体的引用和集合。

关于c# - Entity Framework 检索导航属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14187552/

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