NHibernate 的通用实体

Generic Entity for NHibernate

我正在尝试使用 NHibernate 编写一种通用数据仓库,但我 运行 遇到了几个问题。

我有一个 class 定义如下:

public class Entity
{
    public Entity() { }
    public Entity (string schemaName) 
    {
        this.SchemaName = schemaName;
    }

    [DataMember]
    public string SchemaName { get; set; }

    [DataMember]
    public Guid Id {
        get { return this.Attributes.ContainsKey("id") ? (Guid)this.Attributes["id"] : Guid.Empty; }  
        set { this.Attributes ["id"] = value; }  
    }

    [DataMember]
    public Dictionary<string, object> Attributes = new Dictionary<string, object>();
}

我想做的是使用属性字典作为 table 的列,并将 SchemaName 作为 SQL 中的 table 名称。我有几个 insert/retrieve/delete 的包装函数,但它只能做 ~170/秒。我想通过使用本机 NHibernate 方法来改进这一点。从技术上讲,我可以根据列信息在内存中生成 class 并将其提供给 NHibernate,但我认为这不是最佳选择。

我将如何做到这一点?有更简单的方法吗?

目前我有一些东西可以根据传入的信息生成查询,然后通过在 NHibernate 会话对象上使用 CreateSqlQuery 来执行它。

所以这个问题的答案直接来自 NHibernates 文档,我在这个 post 中找到:How to save a dynamic object in nhibernate

解决方案来自动态模型,您需要在其中配置会话来处理此问题。

Entity representation modes can also be set on a per ISession basis:

using (ISession dynamicSession = pocoSession.GetSession(EntityMode.Map))
{
    // Create a customer
    var frank = new Dictionary<string, object>();
    frank["name"] = "Frank";
    dynamicSession.Save("Customer", frank);
    ...
}
// Continue on pocoSession

另一种选择是设置会话工厂来为您完成这项工作;然而,文档不清楚......或者我懒得找到它......关于如何实现这一点。

感谢@Radim Köhler post为此编写文档。