如何在 NHibernate 中映射没有标识列的视图?

Posted

技术标签:

【中文标题】如何在 NHibernate 中映射没有标识列的视图?【英文标题】:How to map a view without an identity column in NHibernate? 【发布时间】:2011-12-19 20:27:02 【问题描述】:

我有一个观点,我将只读取(不写入)。此视图没有任何唯一键(不是事件组合)。

那么我怎样才能在 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 并通过代码进行映射。

【问题讨论】:

我想你可以创建一个复合键,然后在覆盖 GetHashCodeEquals 时,只提供基本实现? 我会咬紧牙关,将newid() as Id 作为附加列添加到我的视图中。 @seldon:复合键出了什么?数据库列?数据库列中没有真正的复合键可以用作唯一键。此外,我不能只使用我在 MyViewClass 中为复合键定义的属性 Id,因为它仍在数据库中查找此列(不存在)。那么您能否详细说明一下您的解决方案? tnx:> @Rippo:我尽量不咬紧牙关:D 很痛 ;) @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();
    


原答案:

如果你不想插入/更新它,我根本不会映射它

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

【讨论】:

但我想使用 LINQ to NHibernate。所以我想我需要创建映射。 是的;这会起作用,但我正在寻找一种更聪明的方法来做到这一点。另外,我不认为你想实现像 return base.Equals(obj); 这样的 Equals 方法。除非你知道你的基础已经正确实现了 Equals。 @kaptan 我只是在回答您的问题,假设即使所有列都没有形成唯一键。如果它们是唯一的,则正确实施 Equals 和 GetHashCode。问题:更聪明的方式是什么意思?你能制定一个以更智能的方式返回结果的 sql 查询吗?

以上是关于如何在 NHibernate 中映射没有标识列的视图?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 映射 - 带有被重用列的用户类型?

没有外键的NHibernate映射集合

流畅的 nHibernate 映射问题

Fluent NHibernate:如何创建一对多的双向映射?

如何从 NHibernate 映射文件生成“迁移”DDL?

如何使用 NHibernate 在 CompositeId 映射中设置列