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为此编写文档。
我正在尝试使用 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为此编写文档。