Asp.net mvc 为什么要在LINQ To SQL存储库保存方法中使用GetOriginalEntityState()?
我正在看Steven Sanderson的书Pro ASP.NET MVC 2 Framework中的产品存储库中的一个保存方法示例: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
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
也会确保它被附加,这样提交就可以工作了。感谢您对我的问题做了深入的研究!因此,为了澄清,第一个ifif(product.ProductID==0)
检查它是新的还是现有的。else/ifelse-if(productsTable.GetOriginalEntityState(product)==null)
检查产品是否已与表中的相应行关联。。。如果没有,则通过附加将其关联。然后,提交更改。我说的对吗?@quakkels这就是我理解它的方式,但就像我说的,我并没有实际测试它来验证。这是有道理的。。。我正在试图弄清楚如果(productsTable.GetOriginalEntityState(product)=null返回false,什么情况会导致else返回false。我测试了这个,Kelsey成功了。@JohnnyO幸运地猜到了:P