На своем уровне хранилища я сопоставляю объекты Linq-to-Sql объектам моего приложения. Код ниже показывает, как я делаю это для сложного объекта, продукта:
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 (продукт);
Чтобы реализовать это в моем репозитории, мне нужно было бы перебрать каждый объект Image в свойстве Images моего объекта домена Product, проверить, существует ли он, а затем добавить или обновить изображение.
Это кажется большой работой, если я просто хочу добавить одно изображение.
Конечно, я мог бы сделать что-то вроде:
Изображение productImage = new Image (params ...);
_myservice.AddProductImage (product.Id, productImage);
, который был бы более эффективным (поскольку я могу добавить изображение, а затем запись отображения продукта / изображения), но не так хорош, как первый пример.
Что бы вы порекомендовали? Поскольку мое приложение все еще находится на ранней стадии разработки, стоило бы начать смотреть на EF 4.0, так как я бы потерял необходимость отображать мои доменные объекты таким образом?
Спасибо,
Бен