Как отобразить представление без столбца идентификаторов в NHibernate? - PullRequest
3 голосов
/ 20 декабря 2011

У меня есть представление, что я собираюсь только читать (без записи). Это представление не имеет уникального ключа (не составного события).

Так как я могу отобразить этот вид в NHibernate, не касаясь вида? Я не хочу добавлять новый столбец в представление, чтобы создать для меня уникальную личность. Есть ли способ отобразить это представление и создать столбец идентификаторов на стороне NHibernate?

Я могу сгенерировать GUID в своем классе сущностей, например:

public class MyViewClass
{
    private Guid _id = new Guid();
    public virtual Guid Id { get { return _id; } set { _id = value; } }
}

Но как я могу заставить отображение работать? Следующий код не работает:

public class MyViewClass: ClassMapping<MyViewClass>
{
    public MyViewClass()
    {
        Mutable(false);
        Id(x => x.Id, m => m.Generator(Generators.Guid));
    }

} 

Ожидается, что столбец Id будет виден и выдает:

System.Data.SqlClient.SqlException: Invalid column name 'Id'.

Кстати, я использую NHibernate 3.2 и сопоставляю по коду.

1 Ответ

1 голос
/ 20 декабря 2011

Обновление: чтобы использовать его в LINQ, сопоставьте все столбцы как CompositeId и Mutable (false), затем переопределите Equals и GetHashCode с реализацией по умолчанию.

public class MyViewClass
{
    public override bool Equals(object obj)
    {
        return base.Equals(obj);
    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }
}

оригинальный ответ:

я бы вообще не отображал его, если вы не хотите вставлять / обновлять его

public class MyViewClass
{
    public virtual string Prop1 { get; set; }
    public virtual int Prop2 { get; set; }
}

var viewObjects = session.CreateSQLQuery("SELECT col1 as Prop1, col2 as Prop2 FROM MyView")
    .SetResultTransformer(Transformers.AliasToBean<MyViewClass>())
    .List<MyViewClass>();
...