【问题标题】:Why should I use GetOriginalEntityState() in my LINQ To SQL repository save method?为什么我应该在我的 LINQ To SQL 存储库保存方法中使用 GetOriginalEntityState()?
【发布时间】:2011-03-29 04:41:29
【问题描述】:

我正在查看 Steven Sanderson 的书 Pro ASP.NET MVC 2 Framework 中产品存储库中的保存方法示例:

public void SaveProduct(Product product)
{
    // if new product, attach to DataContext:
    if (product.ProductID == 0)
        productsTable.InsertOnSubmit(product);
    else if (productsTable.GetOriginalEntityState(product) == null)
    { 
        // we're updating existing product
        productsTable.Attach(product);
        productsTable.Context.Refresh(RefreshMode.KeepCurrentValues, product);
    }
    productsTable.Context.SubmitChanges();            
}

我不明白else if这一行的逻辑:

else if (productsTable.GetOriginalEntityState(product) == null)

据我了解,GetOriginalEntityState() 返回指定实体的原始状态。在这种情况下,该实体是product

所以这个 else if 语句对我来说是这样的:“如果原件不存在,那么……” 但这没有意义,因为这本书说这会检查我们正在修改已经存在的记录。

在这种情况下我应该如何理解GetOriginalEntityState

编辑

顺便说一句,这段摘录来自第 6 章,第 191 页……以防万一有人拿着这本书想查一下。本书只是在代码示例中包含该函数,但从未解释该函数的作用。

【问题讨论】:

    标签: asp.net-mvc linq-to-sql asp.net-mvc-2


    【解决方案1】:

    这是一个小小的猜测,因为我从未真正使用过GetOriginalEntityState,但这个问题让我很想弄清楚发生了什么。

    我认为这里的目的是检查product 是否仍附加到原始DataContext

    行:

    if (productsTable.GetOriginalEntityState(product) == null) 
    

    我认为如果 product 已被手动分离或创建并且未由 DataContext 处理,这将返回 null。

    来自MSDN

    此方法返回原始状态 一个实体,因为它是 创建或附加到当前 数据上下文。一个原始状态 已序列化的实体和 反序列化必须由一个提供 独立的跟踪机制和 附上实体时提供 到一个新的数据上下文。更多 信息,请参阅数据检索和 N 层应用程序中的 CUD 操作 (LINQ to SQL)。

    我认为要理解的关键是:

    此方法返回原始状态 一个实体,因为它是 创建或附加到当前 数据上下文。

    使用GetOriginalEntityState,以便该方法可以接收一个对象,该对象可以选择不附加到DataContext。附加含义,由 Linq To SQL 调用返回,而不是创建像 Product p = new Product() { ... }; 这样的实例。如果未附加,它将附加到 DataContext 并保留由于 RefreshMode.KeepCurrentValues 参数而修改的任何值(保留更新值)。

    然后productsTable.Context.SubmitChanges(); 总是会发生,因为即使它已分离,GetOriginalEntityState 也会确保它已附加,因此提交将起作用。

    【讨论】:

    • 感谢您解决我的问题!所以,澄清一下,第一个 if if(product.ProductID == 0) 检查它是新的还是现有的。 else/if else if (productsTable.GetOriginalEntityState(product) == null) 检查产品是否已与表中的相应行关联...如果没有,则通过附加来关联它。然后,提交更改。我有这个权利吗?
    • @quakkels 我就是这么理解的,但就像我说的,我还没有实际测试过它来验证。
    • 这很有道理...我试图弄清楚什么情况会导致else if (productsTable.GetOriginalEntityState(product) == null 返回false。
    • 我对此进行了测试,Kelsey 成功了。
    • @JohnnyO 我的幸运猜测:P
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 2018-02-19
    • 1970-01-01
    • 2020-09-23
    • 2016-07-26
    相关资源
    最近更新 更多