我最近通过Steve Sanderson's Pro ASP.NET MVC Framework工作,并遇到了样本“SportsStore”应用程序的问题。 SportsStore是一个简单的CRUD应用程序,它提供了一个编辑器来插入和更新商店中的产品。每个产品都可以有一个图像(存储在SQL Server数据库中,我知道,这可能不是最好的想法,但这是另一个线程的争论)。
我注意到的问题是,当您更新产品时,如果产品有图像,则会丢失产品图像。发生这种情况是因为执行更新的代码正在查找与当前数据库中的内容相比发生更改的字段。当DataContext看到产品更新表单中的文件上载对话框为空时,它将ImageData和ImageMimeType字段设置为null。我希望做的是告诉DataContext如果您正在进行更新并且文件上载对话框内容为空,则不会触摸ImageData和ImageMimeType字段。以下是将更改写入数据库的当前代码:
public void SaveProduct(Product product)
{
EnsureValid(product, "Name", "Description", "Category", "Price");
// If it's a new product, just attach it to the DataContext
if (product.ProductID == 0)
productsTable.InsertOnSubmit(product);
else {
// If we're updating an existing product, tell the DataContext
// to be responsible for saving this instance
productsTable.Attach(product);
// Also tell the DataContext to detect any changes since the last save
productsTable.Context.Refresh(RefreshMode.KeepCurrentValues, product);
}
productsTable.Context.SubmitChanges();
}
如果我需要发布更多内容,请告诉我。您可以从book's site下载此应用的所有源代码。该应用程序位于“第04至06章 - SportsStore”目录中。
作为一个ASP.NET MVC noob,我不确定我试图告诉DataContext不更新特定字段的想法是否正确。如果其他人有更好的计划,我愿意接受各种想法。目标是在更新时保留数据库中的图像。
答案 0 :(得分:1)
也许这与my problem here相反;尝试将关键线更改为:
memberCache.Set(metaMember.Ordinal, false);
您应该可以通过覆盖数据上下文中的SubmitChanges
来使用它:
public override void SubmitChanges(ConflictMode failureMode)
{
foreach(object obj in GetChangeSet().Updates) {
// toggle
}
base.SubmitChanges(failureMode);
}