C # - Свободный вопрос отображения NHibernate - PullRequest
0 голосов
/ 17 декабря 2010

Есть ли способ избежать явного отображения Id в Fluent NHibernate ?

Я хочу, чтобы он как-то автоматически генерировал идентификатор записи, чтобы я не сталдолжны представить его как часть класса.

public class HeyMapping
{
    public String Name { get; set; }
    public DateTime Timestamp { get; set; }
}

public class HeyMapping : ClassMap<HeyMapping>
{
    public HeyMapping()
    {
        Not.LazyLoad();

        // I'm not particularly sure how this line works, but
        // it fails the mapping unit test.
        CompositeId().KeyProperty(x => x.Name);

        Map(x => x.Name).Not.Nullable().Length(64);
        Map(x => x.Timestamp).Not.Nullable();
    }
}

Ответы [ 2 ]

2 голосов
/ 17 декабря 2010

Если вы хотите, чтобы в вашей сущности было без идентификатора , вам все равно нужно сопоставить Id, чтобы NHibernate знал, какой столбец базы данных использовать.

Вы можетезвоните

Id<TColumnDataType>("column_name");

Обратите внимание, что вы откажетесь от некоторых функций NHibernate (в частности, от каскадных обновлений и возможности вызывать SaveOrUpdate()) и понизите производительность на стороне базы данных за наличие идентификатора только для базы данных (Iполагаю, NHibernate придется делать дополнительные запросы для сравнения).

Я обычно допускаю этот момент и допускаю Id как одну проблему постоянства в моих классах домена, поэтому я бы сделал это:

public class HeyMapping
{
    protected internal int Id { get; set; } // persistence concern

    public virtual String Name { get; set; }
    public virtual DateTime Timestamp { get; set; }
}

Я понимаю, что вы, возможно, не захотите этого делать;Я просто сообщаю вам, что есть компромисс.

1 голос
/ 17 декабря 2010

Создайте базовый класс, от которого наследуются все ваши сопоставленные сущности, затем добавьте свойство Id в ваш базовый класс.

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