我使用 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
会抛出异常。
Could not find a setter for property 'ArticleId' in class 'Core.DomainModels.Article'
有没有办法在使用 CreateSqlQuery
时重用 FluentNhibernateMapping?
编辑:
Nhibernate Documentation描述了如何将已映射的实体与 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>();
}
关于c# - Nhibernate:使用已定义的映射调用带有 CreateSqlQuery 的存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10104701/