如何让DataContext在更新记录时忽略特定字段?
问题描述:
我最近通过Steve Sanderson's Pro ASP.NET MVC Framework工作,遇到了示例“SportsStore”应用程序的问题。 SportsStore是一个简单的CRUD应用程序,它提供了一个编辑器来插入和更新商店中的产品。每个产品都可以有一个图像(存储在SQL Server数据库中,我知道,也许不是最好的想法,但这是对另一个线程的争论)。如何让DataContext在更新记录时忽略特定字段?
我注意到的问题是,当您更新产品时,如果产品有图像,则会丢失产品图像。发生这种情况是因为执行更新的代码正在查找与数据库中当前内容相比已更改的字段。当DataContext发现产品更新表单中的文件上载对话框为空时,它将ImageData和ImageMimeType字段设置为空。我希望做的是告诉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下载此应用的所有源代码。该应用程序位于“Chapter 04 to 06 - SportsStore”目录中。
作为一个ASP.NET MVC noob,我不确定我是否试图告诉DataContext不更新特定字段是否正确。如果其他人有更好的计划,我愿意接受。目标是保持数据库中的图像更新。
答
也许这与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);
}
嗯,我想这是唯一的答案,我会接受这个事业...我最终使用数据库触发器来维护数据库中的图像。我知道这很不方便,但它似乎是完成工作的最简单方法。 – 2010-02-03 07:45:21