Nhibernate 3.1 .Net 4.0 - получить составной идентификатор из списка запросов - PullRequest
1 голос
/ 29 июля 2011

У меня есть база данных MS SQL с таблицей, которая имеет составной идентификатор.

Это мой файл конфигурации xml:

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
assembly="SimpleMapping.Domain"
namespace="SimpleMapping.Domain">
  <class name="TabMaster" table="TabMaster">
    <composite-id class="TabMasterCompositeKey">
      <key-property column="Configuration" name="Configuration" type="AnsiString" />
      <key-property column="ResolutionType" name="ResolutionType" type="int" />
    </composite-id>
    <property name="Description" column="Description" type="AnsiString" />
    <property name="Title" column="Title" type="AnsiString" />
    <property name="IdResolutionFileDes" column="idResolutionFileDes" type="AnsiString" />
    <property name="WorkflowType" column="WorkflowType" type="AnsiString" />
    <property name="ViewAllStep" column="ViewAllStep" type="AnsiString" />
    <property name="ManagedData" column="ManagedData" type="AnsiString" />
  </class>
</hibernate-mapping>

Я создал объекты сопоставления:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleMapping.Domain
{
    public class TabMaster
    {
        public virtual string Configuration { get; set; }
        public virtual int ResolutionType { get; set; }
        public virtual string Description { get; set; }
        public virtual string Title { get; set; }
        public virtual string IdResolutionFileDes { get; set; }
        public virtual string WorkflowType { get; set; }
        public virtual string ViewAllStep { get; set; }
        public virtual string ManagedData { get; set; }
    }
}

и

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SimpleMapping.Domain
{
    class TabMasterCompositeKey
    {
        public virtual string Configuration { get; set; }
        public virtual int ResolutionType { get; set; }
        public override bool Equals(object obj)
        {
            TabMasterCompositeKey compareTo = (TabMasterCompositeKey)obj;
            return (this.Configuration == compareTo.Configuration) && (this.ResolutionType == compareTo.ResolutionType);
        }
        public override int GetHashCode()
        {
            return this.ToString().GetHashCode();
        }
        public override string ToString()
        {
            return Configuration.ToString() + "/" + ResolutionType.ToString();
        }
    }
}

В моем Main () я пытаюсь перечислить элементы в таблице следующим образом:

namespace SimpleMapping.Console
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using NHibernate;
    using NHibernate.Cfg;
    using SimpleMapping.Domain;

    class Program
    {
        static void Main(string[] args)
        {
            ISessionFactory sessionFactory = new Configuration().Configure().BuildSessionFactory();

            using (ISession session = sessionFactory.OpenSession())
            {
                using (ITransaction tx = session.BeginTransaction())
                {

                    IQuery query = session.CreateQuery("from TabMaster");

                    foreach (TabMaster tm in query.List<TabMaster>())
                        System.Console.WriteLine(string.Format("ID: {0}\nConfiguration: {1}\nManagedData: {2}\n", tm.Configuration, tm.Description, tm.ManagedData));

                    tx.Commit();
                    session.Close();
                }
            }

            System.Console.ReadKey();
        }
    }
}

, и я вижу параметры, которые не являютсяключ.Таким образом, я могу видеть Description и ManagedData, но не вижу tm.Configuration: в стеке установлено значение Null для каждой записи.

В чем проблема?

Я думаю, это связано справило составного идентификатора (?)

Спасибо за ваш ответ!

1 Ответ

0 голосов
/ 29 июля 2011

Вы должны назвать составной ключ:

<composite-id class="TabMasterCompositeKey" name="TheKey">
      <key-property column="Configuration" name="Configuration" type="AnsiString" />
      <key-property column="ResolutionType" name="ResolutionType" type="int" />
    </composite-id>

и поместите свойство в сущность TabMaster:

public class TabMaster
    {
        public virtual TabMasterCompositeKey TheKey { get; set; }

        public virtual string Description { get; set; }
        public virtual string Title { get; set; }
        public virtual string IdResolutionFileDes { get; set; }
        public virtual string WorkflowType { get; set; }
        public virtual string ViewAllStep { get; set; }
        public virtual string ManagedData { get; set; }
    }

с этим вы сможете увидеть единственное ключевое свойство для сущности.

...