2011-12-19 2 views
3

У меня есть представление, что я буду читать только (не пишет). В этом представлении нет уникального ключа (а не композитного события).Как сопоставить представление без столбца идентификации в NHibernate?

Итак, как я могу сопоставить этот вид в 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'. 

BTW, я использую NHibernate 3.2 и отображение кода.

+0

Я полагаю, вы могли бы создать составной ключ, а затем, когда переопределяя 'GetHashCode' и' Equals', просто предоставляйте базовые реализации? – lbergnehr

+0

Я бы укусил пулю и добавил 'newid() как Id' в качестве дополнительной колонки на мой взгляд. – Rippo

+0

@seldon: составной ключ из чего? столбцы базы данных? нет реального составного ключа из столбцов базы данных, который я могу использовать в качестве уникального ключа. Также я не могу просто использовать идентификатор свойства, который я определил в MyViewClass для составного ключа, потому что он по-прежнему ищет этот столбец в базе данных (который не существует). Так что, пожалуйста, подробно расскажите о своем решении? tnx:> – kaptan

ответ

1

Обновление: чтобы использовать его в 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(); 
    } 
} 

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

я Wouldnt отобразить его на всех, если вы не хотите, чтобы вставить/обновить его

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>(); 
+0

Но я хочу использовать LINQ для NHibernate. Поэтому, я думаю, мне нужно создать сопоставление. – kaptan

+0

Да; это сработало бы, но я искал более умный способ сделать это. Кроме того, я не думаю, что вы когда-либо захотите реализовать метод Equals, например return base.Equals (obj); если вы не знаете, что ваша база правильно применила Equals. – kaptan

+0

@kaptan Я просто отвечал на ваш вопрос, предполагая, что даже все столбцы не образуют уникальный ключ. если они уникальны, то правильно реализуйте Equals и GetHashCode. Вопрос: Что вы имеете в виду более умным способом? можете ли вы сформулировать sql-запрос, который вернет результаты более умным способом? – Firo