【问题标题】:Update DBSet without saveChanges不使用 saveChanges 更新 DBSet
【发布时间】:2018-01-23 16:57:23
【问题描述】:

我尝试达到以下目标:

  • 向 DbContext 的数据集添加新实体。
  • 暂时不要执行 SaveChanges,因为插入后出现任何错误,新条目不应进入数据库
  • 但是,如果新条目在 Customer 集合中,我需要稍后搜索

以下是我现在拥有的:

public virtual DbSet<Customer> Customers { get; set; }

_context.Customers.Add(customer);
// NO _context.SaveChanges();
// ...
var existsingUser = _context.Customers
        .FirstOrDefault(x => x.CodeCustomer == customer.CodeCustomer);
// existsingUser = null, and should be valid populated object

如果我执行 SaveChanges,existingUser 不再为空,而是将数据保存到数据库中。

_context.Customers.Add(customer);
_context.SaveChanges();
// ...
var existsingUser = _context.Customers
        .FirstOrDefault(x => x.CodeCustomer == customer.CodeCustomer);
// existsingUser = has object

是否有任何可能的解决方案来“真正”将客户添加到客户集合中,而不使用 saveChanges()? 如果有,请告诉我,

【问题讨论】:

    标签: c# .net entity-framework transactions entity-framework-6


    【解决方案1】:

    您可以检查Local 属性。来自文档:

    此属性返回一个 ObservableCollection,其中包含当前由给定 DbSet 的上下文跟踪的所有未更改、已修改和已添加对象。

    例如:

    var existsingUser = _context.Customers
        .Local
        .FirstOrDefault(x => x.CodeCustomer == customer.CodeCustomer);
    

    【讨论】:

    • 太棒了,这就是我要找的。我可以从本地和现有的数据库集中获取任何其他属性吗?
    • 不,您需要同时查询。记住一个查询数据库以及本地存储。不过,您可以编写一个包装函数同时轻松完成这两项工作。
    【解决方案2】:

    如果没有SaveChanges(),就无法添加到收藏中。 _context.Customers.Add(customer) 表示您将此对象标记为添加到数据库中。在机舱 EF 上下文中,就像一个事务一样工作。您可以进行大量操作,但只能将SaveChanges() 保存到数据库。

    _context.Customers.FirstOrDefault 从数据库请求数据。

    希望对你有帮助。

    【讨论】:

    • 不正确,您可以使用Local 属性 - 请参阅我的答案。
    猜你喜欢
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多