2012-03-20 2 views
0

Фотографии объектов принадлежат к объекту недвижимости, и одно свойство может иметь много фотографий. Картирование в порядке, создание данных выполняется нормально. В db мои фотографии хранятся, например, Id 1 binarydata PropertyId (100) И статья собственности с идентификатором 100 имеет ссылку на многие фотографии. Я пишу все это, чтобы сказать, что мое создание данных в порядке и картирование.nhibernate sessions

Таким образом, проблема заключается в загрузке коллекции фотографий при показе сведений о недвижимости. Мне нужно загрузить сборку фотографий внутри сеанса, поэтому я застрял здесь.

public ActionResult Details(int id) 
     { 
      MyDomain.Property data = null; 
      using (//session) 
      { 
       using (//transaction) 
       { 
        data = session.QueryOver<MyDomain.Property>() 
         .Where(x => x.Id == id) 
         .Fetch(x => x.Photos).Eager //empty 
         .Fetch(x => x.Features).Eager 
         .SingleOrDefault<MyDomain.Property>(); 

        //I was thinking here to call 
        // data.Photos = GetMyPhotos(id); 
        tx.Commit(); 
        return PartialView("_HomePageDetailsPartial", data); 
       } 

      } 
      //return PartialView("_HomePageDetailsPartial", data);   
     } 

Как вы можете видеть в этом, я попытался использовать data.Photos = GetMyPhotos (id); но при отладке у меня есть сообщение об ошибке. Невозможно обновить столбец идентификатора «Id».
Не удается обновить столбец идентификатора «Id». Даже эта работа, я убежден, что есть более элегантный способ получить сбор фотографий для определенного свойства.

Мои отображения

public class PhotoMap : ClassMap<Photo> 
    { 
     public PhotoMap() 
     { 
      Table("Photo"); 
      Id(x => x.Id).GeneratedBy.Identity(); 
      Map(x => x.ImageData).CustomSqlType("VARBINARY(MAX)").Length(160000).Not.Nullable(); 
      Map(x => x.ImageMimeType).Not.Nullable(); 
      References(x => x.Property).Column("PropertyId"); 

     } 
    } 

public class PropertyMap : ClassMap<Property> 
    { 
     public PropertyMap() 
     { 
      Table("Property"); 
      Id(x => x.Id).GeneratedBy.Identity(); 
      ... 
      References(x => x.Features, "FeaturesId"); 
      HasMany(x => x.Photos).KeyColumn("Id").Cascade.All(); 
     } 
    } 

DB снимок Две таблицы, собственности и фотография.

Id int not null 
Title nvarchar(255) not null 
PhotoId int not null 

фотография таблица

Id int not null 
ImageData varbinary(MAX) null 
ImageMimeType varchar(50) null 
PropertyId int not null 

отношений выглядит следующим образом:

FK_Property_Photo

Primary Key table  Foreign key table 
-------------------------------------------- 
Photo     Property 
-------------------------------------------- 
Id      PhotoId 
+0

Вы уверены, что ваше сопоставление в порядке? Поскольку этот первый Fetch должен уже заполнить вашу коллекцию фотографий. Я бы посмотрел на сгенерированный SQL и посмотрел, действительно ли NHibernate пытается загрузить связанные фотографии, и если в этих запросах есть ошибки. –

+0

Я не могу понять, зачем вам нужны данные. Фото = GetMyPhotos (id); '. Затем вы получаете свои «данные свойства» с сеанса с загруженными фотографиями и фотографиями, данные. Фото уже загружены всеми фотографиями. – Nikolay

+0

Можете ли вы включить свое картографирование. Ваше сопоставление неверно по сравнению с вашей схемой базы данных, и оно пытается обновить значение. – Phill

ответ

4

ваш KeyColumn в вашем отображении является неправильным. KeyColumn используется для определения столбца внешнего ключа в n-таблице. В вашем случае ключевой столбец должен быть «PropertyId».

Кроме того: почему у вас есть столбец PhotoId в таблице свойств, если соотношение между свойством и фотографией равно 1: n?

+0

, так что вы в основном говорите, что мне нужно избавиться от моей колонки PhotoId, так как у меня уже есть отношения на Photo table с помощью PropertyId? Будете ли вы любезны передать мне пример картирования HasMany для PropertyMap и PhotoMap – BobRock

+0

Да, я думаю, что GarlandGreene прав. Что касается меня, я обычно не использую KeyColumn явным. – Anton

+1

Вам просто нужно определить KeyColumn как «PropertyId», и все должно быть в порядке. В PropertyMap: HasMany (x => x.Photos) .KeyColumn ("PropertyId"). Cascade.All(); Кстати, это также причина, в которой работает вставка: при вставке, по умолчанию дочерний объект отвечает за идентификацию родительского объекта. Поскольку нарушено отношение от свойства к его фотографиям (а не отношение от фотографии к его родительскому свойству), вставляет работу и выбирает нет. –