【问题标题】:Get data back from context before commit在提交之前从上下文中取回数据
【发布时间】:2015-10-16 11:57:14
【问题描述】:
customers customer = GetCustomer();
customer.UserId = userId;
customer.NeedToPayTax = true;
customer.IsApproved = false;
_customerRepository.Create(customer);

稍后在我们进行提交之前,我尝试搜索这个新的customer

public int GetUncofirmedCount()
{
    var query = from p in _context.Set<customers>()
                where p.IsApproved == false
                select p;

    return query.Count();
}

但大小始终为0。如果我提交,那么我可以看到正确的结果。为什么?即使尚未提交,如何从上下文中取回数据?

【问题讨论】:

  • EF 的哪个版本?
  • 您是否使用上下文的相同实例来保存实体并稍后进行查询?
  • _context = unitOfWork.Context as DbContext;所以它必须始终相同
  • 版本是 EF 6.1.3(最后一个)

标签: c# sql entity-framework sql-server-2008


【解决方案1】:

未经测试的代码:

    _customerRepository.ObjectStateManager.GetObjectStateEntries(EntityState.Added)
.Where(o => o.GetType() == typeof(Customer) && o => !o.IsApproved)
.Count();

或者,对于较新版本的 EF,请查看 Local

_customerRepository.Customers.Local
    .Where(o => o.GetType() == typeof(Customer) && o => !o.IsApproved)
    .Count();

【讨论】:

  • 为什么要使用 ObjectStateManager 而不是简单的 _context?不能这样通用吗? _context 可以为我做这个魔术吗?
  • 因为context 查询数据库,这就是它的目的。但在更高版本的 EF 中,您应该能够使用本地缓存,请参阅更新。
  • 谢谢信息。但是后来我需要在很多地方调用这个逻辑,并且不能通用。也许我可以合并 _context 中所有未批准的更改?
  • 我不确定你需要什么样的泛型,但你当然可以实现一个泛型方法public T GetAddedEntity&lt;T&gt;() 并更改为typeof(T),但话说回来,如果你不这样做,你将如何使用IsApproved '不知道你得到什么对象?
  • 我不知道你想在更大的范围内实现什么。只是试图描述您可以做些什么来获取尚未保存到数据库的Entities。剩下的就看你自己了。
猜你喜欢
  • 2020-10-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多