为什么我应该在LINQ To SQL存储库保存方法中使用GetOriginalEntityState()?

qua*_*els 5 asp.net-mvc linq-to-sql asp.net-mvc-2

我正在看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();            
}
Run Code Online (Sandbox Code Playgroud)

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

else if (productsTable.GetOriginalEntityState(product) == null)
Run Code Online (Sandbox Code Playgroud)

据我所知, GetOriginalEntityState()返回指定实体的原始状态..在这种情况下,实体是product.

所以这个if语句对我来说就是:"如果原来不存在那么......"但这没有意义,因为这本书说这检查我们正在修改已经存在的记录.

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

编辑

顺便说一句,这段摘录来自第191页的第6章......以防万一有人拿到这本书并且想要查阅它.这本书在代码示例中只具有该功能,但它从未解释该函数的功能.

Kel*_*sey 5

这是一个有点猜测,因为我从来没有真正使用过,GetOriginalEntityState但问题突出了我的兴趣,弄清楚发生了什么.

我认为这里的目的是检查它product是否仍附在原件上DataContext

这条线:

if (productsTable.GetOriginalEntityState(product) == null) 
Run Code Online (Sandbox Code Playgroud)

我认为如果product已经手动取消或手动创建并且没有被处理,这将返回null DataContext.

来自MSDN:

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

我认为要理解的关键是:

此方法返回实体的原始状态,因为它已创建或附加到当前DataContext.

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

然后productsTable.Context.SubmitChanges();总是发生,因为即使它被释放,GetOriginalEntityState它将确保它被附加所以提交将起作用.