Nhibernate:使用已定义的映射使用 CreateSqlQuery 调用存储过程
本文关键字:CreateSqlQuery 调用 存储过程 映射 定义 Nhibernate | 更新日期: 2023-09-27 18:30:48
I 使用 ISession.CreateSQLQuery
调用存储过程。
然后我用
SetResultTransformer(new AliasToBeanResultTransformer(typeof(Article))).List<Article>().ToList()
这种方法的问题在于,AliasToBeanResultTransformer
仅将Article
表一对一映射到Article
类。
public class Article : Entity
{
public virtual string Description { get; set; }
}
public class Entity
{
public virtual int Id { get; set; }
}
public class ArticleRepository : Repository<Article>, IArticleRepository
{
private ISession _session;
public ArticleRepository(ISession session) : base(session)
{
_session = session;
}
public List<Article> GetByDescription(string description)
{
return _session
.CreateSQLQuery("EXEC ArticlesByDescription :Description")
.SetString("Description", description)
.SetResultTransformer(new AliasToBeanResultTransformer(typeof(Article)))
.List<Article>().ToList();
}
}
但是我在Article
表上的主键称为 ArticleId
,因此AliasToBeanResultTransformer
抛出异常。
在类中找不到属性"ArticleId"的二传手 'Core.DomainModels.Article'
有没有办法在使用CreateSqlQuery
时重用FluentNhibernateMapping?
编辑:
Nhibernate 文档描述了如何将已映射的实体与 hbm 文件一起使用。
<sql-query name="GetProductsByCategoryId">
<return class="Product" />
exec dbo.GetProductsByCategoryId :CategoryId
</sql-query>
我真的问自己为什么不能仅通过代码做到这一点?!
我正在使用此代码映射到存储库中的实体。我相信它也适用于调用过程:
public IEnumerable<Address> Search(string query, int maxCount)
{
return session.CreateSQLQuery("SELECT * FROM address WHERE fts_col @@ plainto_tsquery('cs', :query) LIMIT :limit;")
.AddEntity(typeof(Address)) // this is probably what you need to map to entity
.SetString("query", query)
.SetInt32("limit", maxCount)
.List<Address>();
}
似乎
无法使用ISession.CreateSQLQuery
并从ISession
中获取映射的实体。
我现在所做的是同时使用 hbm 文件和 FluentNhibernate 映射。
Hbm:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Core" namespace="Core.DomainModels">
<sql-query name="ArticlesByDescription">
<return class="Article" />
EXEC ArticlesByDescription :Description
</sql-query>
</hibernate-mapping>
FluentNhibernate:
public class ArticleMapping : ClassMap<Article>
{
public ArticleMapping()
{
Id(x => x.ArticleId).GeneratedBy.Identity();
Map(x => x.Description).UniqueKey("Article_Description_Unique");
}
}
配置:
public class ConfigurationFactory
{
const string Database = "";
const string Server = "";
public static Configuration Build()
{
return Fluently.Configure()
.Database(MsSqlConfiguration.MsSql2008.ConnectionString(
c => c.Database(Database).TrustedConnection().Server(Server)))
.Mappings(m =>
{
m.FluentMappings.AddFromAssemblyOf<ArticleMapping>();
m.HbmMappings.AddFromAssemblyOf<ArticleMapping>();
})
//.ExposeConfiguration(c => new SchemaExport(c).Execute(true, true, false))
.BuildConfiguration();
}
}
存储 库:
public class ArticleRepository : Repository<Article>, IArticleRepository
{
private ISession _session;
public ArticleRepository(ISession session) : base(session)
{
_session = session;
}
public List<Article> GetByDescription(string description)
{
return _session
.GetNamedQuery("ArticlesByDescription")
.SetString("Description", description)
.List<Article>().ToList();
}
}