Как использовать хранимую процедуру в nhibernate

StackOverflow https://stackoverflow.com/questions/4780720

  •  23-10-2019
  •  | 
  •  

Вопрос

Здравствуйте, я пытаюсь использовать хранимую процедуру в Nhibernate, и я нашел несколько методов:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <sql-query name="CO_Visites_Treeview_Sel">
    exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
  </sql-query>
</hibernate-mapping>

Если я хочу использовать данные, которые я буду использовать:

var query = session.GetNamedQuery("CO_Visites_Treeview_Sel");
query.SetString("Idclient", lstClients.SelectedValue.ToString());
query.SetInt32("Idmagasin", 36);
query.SetBoolean("Autre", false);
query.SetBoolean("Tous", true);
var results = query.List();

В этом случае у меня не будет Intellisence, ни результата ['colname'

Я использую другой метод:

    <?xml version="1.0" encoding="utf-8" ?>
    <hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
      <class name="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess" lazy="true">
        <id name="Idvisite" column="IDVISITE" type="string">
          <generator class="assigned" />
        </id>
        <property column="NOMMAGASIN" name="Nommagasin" type="string" />
        <property column="DATEVIS" name="Datevis" type="DateTime" />
        <property column="INTERVENTION" name="Intervention" type="Boolean" />
        <property column="IDFACTURE" name="Idfacture" type="string" />
        <property column="STATUT" name="Statut" type="byte" />
        <property column="NOFACTURE" name="Nofacture" type="int" />
        <property column="NODEVIS" name="Nodevis" type="int" />
        <property column="LIVRE" name="Livre" type="Boolean" />
        <property column="NOCOMMANDE" name="Nocommande" type="int" />
        <property column="COMPTABILISEE" name="Comptabilisee" type="Boolean" />
        <property column="RECUP" name="Recup" type="Boolean" />
        <property column="MASQUE" name="Masque" type="Boolean" />
      </class>
      <sql-query name="CO_Visites_Treeview_Sel">
        <return alias="Visites_Treeview" class="NHibernate.DataAccess.Models.Visites_Treeview,NHibernate.DataAccess">
          <return-property column="NOMMAGASIN" name="Nommagasin" />
          <return-property column="IDVISITE" name="Idvisite" />
          <return-property column="DATEVIS" name="Datevis" />
          <return-property column="INTERVENTION" name="Intervention" />
          <return-property column="IDFACTURE" name="Idfacture" />
          <return-property column="STATUT" name="Statut" />
          <return-property column="NOFACTURE" name="Nofacture" />
          <return-property column="NODEVIS" name="Nodevis" />
          <return-property column="LIVRE" name="Livre" />
          <return-property column="NOCOMMANDE" name="Nocommande" />
          <return-property column="COMPTABILISEE" name="Comptabilisee" />
          <return-property column="RECUP" name="Recup" />
          <return-property column="MASQUE" name="Masque" />
        </return>
        exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
      </sql-query>
    </hibernate-mapping>

Я создал класс бобов. В этом случае результаты будут сильно напечатать объект, но у меня есть некоторая проблема с согласованностью. Но у меня нет реального идентификатора, поэтому, если есть два idvisite, второй будет игнорироваться. Я попытался создать композитный ключ, но он не работает.

<composite-id>
  <key-property name="Idvisite" column="IDVISITE" type="string" />
  <key-property name="Idfacture" column="IDFACTURE" type="string" />
</composite-id>

И у меня ошибка:

could not execute query
[ exec CO_Visites_Treeview_Sel @p0, @p1, @p2, @p3 ]
  Name:Idclient - Value:036000004130  Name:Idmagasin - Value:36  Name:Autre - Value:False  Name:Tous - Value:True
[SQL: exec CO_Visites_Treeview_Sel @p0, @p1, @p2, @p3]

Кто -нибудь может сказать мне, как сделать?

С Уважением

Это было полезно?

Решение

Попробуйте это, ваше отображение:-

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2">
  <sql-query name="CO_Visites_Treeview_Sel">
    exec CO_Visites_Treeview_Sel :Idclient, :Idmagasin, :Autre, :Tous
  </sql-query>
</hibernate-mapping>

Используйте SetResultTransformer ...

var results = Session
    .GetNamedQuery("CO_Visites_Treeview_Sel")
    .SetString("Idclient", lstClients.SelectedValue.ToString())
    .SetInt32("Idmagasin", 36)
    .SetBoolean("Autre", false)
    .SetBoolean("Tous", true)
    .SetResultTransformer(new AliasToBeanResultTransformer(typeof(YOURCLASS)));

return results.List<YOURCLASS>();

и ваш класс:-

public class YOURCLASS 
{
    public virtual int ColA { get; set; }
    public virtual string COLB { get; set; }
    public virtual int COLC { get; set; }
    // etc..
}

Hth

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top