2011-07-29 37 views
1

我有一個MS SQL數據庫,其中包含一個具有組合ID的表。Nhibernate 3.1 .Net 4.0 - 從查詢列表中獲取Composite-Id

這是我的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。

有什麼問題?

我認爲這是關係到複合ID規則(?)

謝謝您的回覆!

回答

0

你應該命名爲複合鍵:

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

與此,你將能夠看到實體單個鍵屬性。

+0

非常感謝!有用! – Emanuele