在我的存储库层中,我将Linq-to-Sql对象映射到我的应用程序域对象。下面的代码显示了我如何为复杂对象product:
执行此操作 public IQueryable<Product> Products {
get
{
var result = from p in _db.Products
let images = GetProductImages(p.ProductID)
select new Product {
Id = p.ProductID,
SKU = p.SKU,
Name = p.Name,
ShortDescription = p.ShortDescription,
Description = p.Description,
Price = p.Price,
Weight = p.Weight,
StockQuantity = p.StockQuantity,
IsAvailable = p.IsAvailable,
AllowBackOrder = p.AllowBackOrder,
PageMetaData = ConvertXmlToDictionary(p.PageMetaData),
Images = new LazyList<ProductImage>(images)
};
return result;
}
}
这适用于任何子对象(例如图像)。
但是,保存我的产品时一切都不顺利。因为我没有使用Linq对象,所以我可能会丢失任何对象跟踪。
因此,在理想的世界中,我会在服务层执行以下操作:
图片productImage = new Image(params ...); product.Images.Add(productImage); _myservice.SaveProduct(产品);
要在我的存储库中实现这一点,我需要遍历我的Product域对象的Images属性中的每个Image对象,检查它是否存在然后添加或更新图像。
如果我只想添加一张图片,这似乎很有用。
当然,我可以这样做:
图片productImage = new Image(params ...); _myservice.AddProductImage(product.Id,productImage);
哪个会更有效率(因为我可以添加Image然后添加产品/图像映射记录),但不如第一个例子好。
你会推荐什么?由于我的应用程序仍处于开发的早期阶段,因此开始查看EF 4.0是值得的,因为我不再需要以这种方式映射我的域对象吗?
谢谢, 本
答案 0 :(得分:1)
我上周正在帮助一位遇到类似问题的同事。我们的解决方案是消除产品与其形象之间的直接关联。相反,我们提供了一个单独的查询(不是一个惰性列表)来加载图像。这是因为在我们的模型中,检索图像所需的连接过多地影响了性能。
我们现在有类似的东西:
_myservice.GetProduct(id); _myservice.GetImagesForProduct(id);
就编辑产品而言,您不一定需要立即进行所有编辑。为什么不对产品信息进行一次编辑,对图像进行另一次编辑?
_myservice.Update(productId, parameters); _myservice.AddImageToProduct(productId, image); _myservice.RemoveImageFromProduct(productId, imageId);