2

我正在使用 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 具有更新的实体。所以我在检索更新的实体之前尝试清除,但没有运气。我也尝试通过上下文重新加载实体,但它不会重新加载导航属性。我不能像使用通用存储库一样使用引用属性。我能完成的唯一方法是处理和创建上下文和数据库集的新实例。

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

4

2 回答 2

1

我启用了延迟加载

我正在附加 POCO 实体

我从您的评论中假设,在您的应用程序的某个地方,您正在像这样实例化您的实体,因此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. 使用反射显式加载该实体的引用和集合。
于 2013-01-15T04:22:06.770 回答
1

SaveChanges 返回一个int. 你想要实体回来,试试这个:

public T Update(T t)
{
    dbSet.Attach(t);
    context.Entry(t).State = EntityState.Modified;
    context.SaveChanges();
    return t;
}
于 2013-01-06T22:42:13.683 回答