Asp.net mvc 为什么要在LINQ To SQL存储库保存方法中使用GetOriginalEntityState()?

Asp.net mvc 为什么要在LINQ To SQL存储库保存方法中使用GetOriginalEntityState()?,asp.net-mvc,linq-to-sql,asp.net-mvc-2,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 (p

我正在看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)
据我所知,
getoriginalentystate()
返回指定实体的原始状态。。在这种情况下,实体是
产品

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

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

编辑
顺便说一下,这段摘录来自第6章,第191页。。。以防万一有人拿着这本书想查一查。这本书的代码示例中只包含了该函数,但它从未解释该函数的功能。

这只是一个小小的猜测,因为我从未实际使用过
GetOriginalEntityState
,但这个问题使我的兴趣达到顶峰,想弄清楚到底发生了什么

我认为这里的目的是检查
产品
是否仍然附加到原始的
数据上下文

该行:

if (productsTable.GetOriginalEntityState(product) == null) 
如果
产品
已被手动删除或创建,且未由
数据上下文
处理,我认为这将返回null

发件人:

此方法返回原始状态 实体的,因为它是 已创建或附加到当前 数据上下文。原始状态 已序列化的实体,并且 反序列化必须由 独立跟踪机制及应用 附加实体时提供 到新的DataContext。更多 有关详细信息,请参见数据检索和管理 N层应用程序中的CUD操作 (LINQ到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这就是我理解它的方式,但就像我说的,我并没有实际测试它来验证。这是有道理的。。。我正在试图弄清楚如果(productsTable.GetOriginalEntityState(product)=null返回false,什么情况会导致
else返回false。我测试了这个,Kelsey成功了。@JohnnyO幸运地猜到了:P