保存使用linq映射到sql的复杂域对象

时间:2010-03-16 15:31:21

标签: linq-to-sql

在我的存储库层中,我将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是值得的,因为我不再需要以这种方式映射我的域对象吗?

谢谢, 本

1 个答案:

答案 0 :(得分:1)

我上周正在帮助一位遇到类似问题的同事。我们的解决方案是消除产品与其形象之间的直接关联。相反,我们提供了一个单独的查询(不是一个惰性列表)来加载图像。这是因为在我们的模型中,检索图像所需的连接过多地影响了性能。

我们现在有类似的东西:

_myservice.GetProduct(id);
_myservice.GetImagesForProduct(id);

就编辑产品而言,您不一定需要立即进行所有编辑。为什么不对产品信息进行一次编辑,对图像进行另一次编辑?

_myservice.Update(productId, parameters);
_myservice.AddImageToProduct(productId, image);
_myservice.RemoveImageFromProduct(productId, imageId);