Свободное владение Nhibernate для сохранения дочернего объекта - PullRequest
2 голосов
/ 19 марта 2012

У меня следующая ситуация.Один объект свойства, содержащий коллекцию списка фотографий и объект Photo, может ссылаться на один или несколько объектов свойства.Итак, у меня есть такое отображение, которое, я думаю, прекрасно

public PropertyMap()
{
  Table("Property");
  Id(x => x.Id).GeneratedBy.Identity();
  Map(x => x.Title).Length(255).Not.Nullable();
  HasMany(x => x.Photos).KeyColumn("Id");
}

public PhotoMap()
 {
    Table("Photo");
    Id(x => x.Id).GeneratedBy.Identity();
    Map(x => x.Version);
    Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000);
    Map(x => x.ImageMimeType);
    References( x => x.Property ) 
        .Column('PhotoId')
        .Cascade.All();
 }

Поток данных в моем сценарии: пользователь вводит данные в некоторой форме и выбирает до пяти изображений на одно свойство для создания данных.Эти данные отправляются в контроллер HttpPost, который получает PropertyViewModel newData и IEnumerable изображения.Затем, если состояние модели в порядке, я открываю сеанс и транзакцию и отправляю эти данные в модель предметной области, а затем сохраняю эти данные в БД. Все ок, кроме изображений не сохраняются?Ошибка не выдается, в режиме отладки изображения передаются регулярно.

Вот код создания контроллера и метод PropertyViewModel ToDomainModel ()

[HttpPost]
public ActionResult Create(PropertyViewModel newData, IEnumerable<HttpPostedFileBase> images)           
 {
    if (ModelState.IsValid)
    {
       using (/// open session)
       {
          using (// using transaction)
          {
             MyDomain.Property model = new MyDomain.Property();
             newData.ToDomainModel(model, images);

            tx.Commit();
            session.Save(model);
          }
       }
       return RedirectToAction("Index");
    }
    else
    {
       return View(newData);
    }
 }

И в ToDomainModel внутри ViewModel я получаю изображениявместе с другими данными и попробуйте добавить их в модель. Коллекция фотографий и сохранить их.

 public void ToDomainModel(Property x, IEnumerable<HttpPostedFileBase> Images)
    {
        x.Id = Id;            

        List<Photo> Photos = new List<Photo>();
        foreach (var image in Images)
        {
            if (image != null && image.ContentLength > 0)
            {
                Photo p = new Photo();
                p.Property = x;
                p.ImageMimeType = image.ContentType;
                p.ImageData = new byte[image.ContentLength];
                image.InputStream.Read(p.ImageData, 0, image.ContentLength);

                Photos.Add(p);
            }
        }
        x.Photos = Photos;

1 Ответ

4 голосов
/ 19 марта 2012

Вам необходимо добавить Cascade.All() к вашему HasMany отображению в PropertyMap, а не к References в PhotoMap, потому что вы сохраняете экземпляр Property и вам необходимо также каскадно объединять его коллекцииспаси своих детей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...