Как отобразить SubclassMap и HasManyToMany в Свободном NHibernate - PullRequest
1 голос
/ 03 мая 2010

Моя проблема заключается в том, что nhibernate свободно отображает отношения «многие ко многим».

public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Password);
        Map(x => x.Confirmed);
        HasMany(x => x.Nodes).Cascade.SaveUpdate();
        HasManyToMany<Node>(x => x.Events).Cascade.SaveUpdate().Table("RSVPs");
    }

public EventMap()
    {

        Map(x => x.Starts);
        Map(x => x.Ends);
        HasManyToMany<User>(x => x.Rsvps).Cascade.SaveUpdate().Table("RSVPs");
    }

public NodeMap() {
        Id(x => x.Id);

        Map(x => x.Title);
        Map(x => x.Body).CustomSqlType("text");
        Map(x => x.CreationDate);
        References(x => x.Author).Cascade.SaveUpdate();
        Map(x => x.Permalink).Unique().Not.Nullable();

    }

Это мои классы - обратите внимание, что Event наследует от Node:

public class Event : Node//, IEvent
{
    private DateTime _starts = DateTime.MinValue;
    private DateTime _ends = DateTime.MaxValue;
    public virtual IList<User> Rsvps { get; set; }

}

Проблема в том, что сгенерированная таблица RSVP выглядит следующим образом:

event_id Идентификатор пользователя Node_id

Конечно, таблица событий не имеет идентификатора - только Node_id.

При попытке сохранить отношение он попытается сохранить NULL event_id, что приведет к ошибке.

1 Ответ

0 голосов
/ 05 мая 2010

Хорошо, я должен был лучше знать беглый NHibernate: после проб и ошибок все работает. Тем не менее, я должен углубить свои знания. Это рабочий код:

public class UserMap : ClassMap<User>
{
    public UserMap()
    {
        Id(x => x.Id);
        Map(x => x.Name);
        Map(x => x.Password);
        Map(x => x.Confirmed);
        HasMany(x => x.Nodes).Cascade.SaveUpdate();
        HasManyToMany<Node>(x => x.Events)
            .Table("RSVPs")
            .ParentKeyColumn("User_id")
            .ChildKeyColumn("Event_id");
    }
}

public EventMap()
    {

        Map(x => x.Starts);
        Map(x => x.Ends);
        HasManyToMany(x => x.Rsvps)
            .Cascade.SaveUpdate()
            .Table("RSVPs")
            .Inverse()
            .ParentKeyColumn("Event_id")
            .ChildKeyColumn("User_id");
    }

public NodeMap() 
{
        Id(x => x.Id);

        Map(x => x.Title);
        Map(x => x.Body).CustomSqlType("text");
        Map(x => x.CreationDate);
        References(x => x.Author).Cascade.SaveUpdate();
        Map(x => x.Permalink).Unique().Not.Nullable();
    }

(класс узла и события остаются неизменными)

Я должен был указать:

  1. Название таблицы
  2. Имя ParentKeyColumn и ChildKEyColumn (обратите внимание, что они обратны в двух классах)
  3. Инверсия при отображении EventMap

Надеюсь, что это может помочь кому-то в качестве примера HasManyToMany / SubclassMap.

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