Сохранение сложных доменных объектов, сопоставленных с использованием linq в sql - PullRequest
1 голос
/ 16 марта 2010

На своем уровне хранилища я сопоставляю объекты 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, так как я бы потерял необходимость отображать мои доменные объекты таким образом?

Спасибо, Бен

1 Ответ

1 голос
/ 16 марта 2010

Я помогал коллеге с подобной проблемой на прошлой неделе. Нашим решением было устранить прямую связь между продуктом и его изображением. Вместо этого мы предоставили отдельный запрос (не ленивый список) для загрузки изображения. Это связано с тем, что в нашей модели объединения, необходимые для получения изображения, слишком сильно сказывались на производительности.

Теперь у нас есть что-то вроде:

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

Что касается редактирования продукта, вам не обязательно выполнять все редактирование одновременно. Почему бы не один редактор для информации о продукте, а другой для изображений?

_myservice.Update(productId, parameters);
_myservice.AddImageToProduct(productId, image);
_myservice.RemoveImageFromProduct(productId, imageId);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...