NHibernate многие-ко-многим с композитным элементом - PullRequest
1 голос
/ 04 апреля 2010

Я столкнулся со следующей проблемой. В моем приложении используются сущности Owner и Area, привязывающие столько же ко многим.

public class Area : DomainObject<int> {        
    private ISet<OwnersPeriod> _owners = new HashedSet<OwnersPeriod>();

    public ICollection<OwnersPeriod> Owners {
        get { return _owners; }
        set {
            Check.Require(value != null);
            _owners = new HashedSet<OwnersPeriod>(value);
        }
    }
}

Таблица Owner2Area имеет следующие поля:

CREATE TABLE [dbo].[Owner2Area](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [IDOwner] [int] NOT NULL,
    [IDArea] [int] NOT NULL,
    [FirstDate] [datetime] NOT NULL,
    [LastDate] [datetime] NULL,
 CONSTRAINT [PK_Owner2Area] PRIMARY KEY CLUSTERED)

Поэтому соответствует классу OwnersPeriod

    public class OwnersPeriod {
        private Owner _member;
        private Area _area;    
        public Owner Owner { get {...} set{...} }    
        public Area Area { get { ... } set { ... } }    
        public  DateTime FirstDate { get; set; }    
        public  DateTime? LastDate { get; set; }       
    }

Я написал сопоставления

<class lazy="false" name="Core.Domain.Area, Core" table="Areas">
   ...
   <set name="Owners" table="Owner2Area" inverse="true" lazy="true" >
      <key column="IDArea"/>
      <composite-element class="Core.Domain.OwnersPeriod, Core" >
        <parent name="Area" />
        <property name="FirstDate" type="datetime"/>
        <property name="LastDate" type="datetime"/>
        <many-to-one name="Owner" class="Core.Domain.Owner, Core" column="IDOwner"/>
      </composite-element>
    </set>
</class>

Для каждой области существующие данные успешно загружаются в Owners, но когда я добавляю новую запись в Owner2Area - CreateSQLQuery, эти данные не обновляются, например, для области. Если я снова открыл форму и получил все области, добавленная ссылка успешно загружена в коллекцию.
Как можно принудительно загрузить добавленную таким образом запись отношения «многие ко многим»?
Nhibernate v.2.0.1, дБ MSSQL 2005

1 Ответ

0 голосов
/ 05 апреля 2010

Если вы используете CreateSQLQuery, NHibernate не знает, что вы сделали. Просто подумай минутку. CreateSQLQuery был добавлен, потому что не все возможно с HQL и CriteriaQuery. Так что с CreateSQLQuery вы делаете «особые вещи».

Многие ко многим не рекомендуется, потому что у вас нет «прямой обработки» «средней таблицы». Если вы добавите сущность в отношение многие ко многим способом nhibernate (изменение коллекции), а затем выполните обновление сущности, вы увидите, что nhibernate удаляет все данные из «средней таблицы», а затем вставляет их снова. Так что не хорошо. Вот почему вы, вероятно, думали, что вы бы сделали обходной путь, используя CreateSQLQuery. Я предлагаю вам установить классические отношения родитель-потомок с тремя сущностями, чтобы вы могли напрямую манипулировать «средней таблицей».

Другое решение состоит в том, что когда вы обновляете «среднюю таблицу», вы выполняете Evict (это метод ISession и метод в ISessionFactory, см. Руководство) объекта, на который влияет CreateSQLQuery. Но использование этого приведет к другому попаданию в базу данных (будет загружена новая версия). Использование родительско-дочернего подхода не приведет к попаданию в базу данных.

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