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>

我真的问自己为什么不能仅通过代码做到这一点?!

Nhibernate:使用已定义的映射使用 CreateSqlQuery 调用存储过程

我正在使用此代码映射到存储库中的实体。我相信它也适用于调用过程:

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