2011-10-05 139 views
1

我有一個使用NHibernate和MySQL的c#.net 3.5應用程序。NHibernate:多對多的映射異常

我的SQL表在一個多到多模式連接配置字符串被佈局爲任務

CREATE TABLE `configstring` (
    `ConfigStringID` int(11) NOT NULL AUTO_INCREMENT, 
    `ConfigString` varchar(45) NOT NULL, 
    PRIMARY KEY (`ConfigStringID`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `task_configstring` (
    `ConfigStringID` int(11) NOT NULL, 
    `TaskID` int(11) NOT NULL, 
    PRIMARY KEY (`ConfigStringID`,`TaskID`), 
    KEY `TaskID` (`TaskID`), 
    KEY `ConfigStringID` (`ConfigStringID`), 
    CONSTRAINT `ConfigStringID` FOREIGN KEY (`ConfigStringID`) REFERENCES `configstring` (`ConfigStringID`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `TaskID` FOREIGN KEY (`TaskID`) REFERENCES `task` (`TaskID`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 

CREATE TABLE `task` (
    `TaskID` int(11) NOT NULL AUTO_INCREMENT, 
    PRIMARY KEY (`TaskID`) 
) ENGINE=InnoDB AUTO_INCREMENT=19 DEFAULT CHARSET=latin1 

我有一個Task類,它包含這樣的配置字符串列表:

public class Task 
{ 
    public virtual IList<string> ConfigurationStrings { get; set; } 
} 

該類到數據庫的NHibernate XML映射如下所示:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" 
        assembly="QueueTest" 
        namespace="Phoenix.Action"> 

    <class name="Task" table="queue_task"> 
     <id name="Id" column="TaskID" type="int" > 
      <generator class="native"/> 
     </id> 

     <bag name="ConfigurationStrings" table="queue_task_configstring"> 
      <key column="TaskID"/> 

      <many-to-many column="ConfigStringID"/> 

     </bag> 
    </class> 

</hibernate-mapping> 

但是,當我打電話Configuration().BuildSessionFactory(),我得到這個異常:An association from the table task_configstring does not specify the referenced entity

什麼是做了許多一對多映射到一個System.String對象的正確方法是什麼?

回答

0

你有ConfigString類嗎?

您在多對多映射中缺少類名。

創建一個新的ConfigString實體:然後

class ConfigStringEntity 
{ 
    public virtual int ConfigStringID { get; set; } 

    public virtual string ConfigString { get; set; } 
} 

<many-to-many class="ConfigStringEntity" column="ConfigStringID"/> 

你的名單將是ConfigStringEntity的列表。

public class Task 
{ 
    public virtual IList<ConfigStringEntity> ConfigurationStrings { get; set; } 
} 
+1

該類是一個System.String。我只想從'ConfigString'列的字符串 – PaulH

+0

除非我弄錯了,否則您仍然需要一個ConfigString實體,然後您將在多對多關係中使用它。 –

+1

創建一個類來包裝一個字符串似乎是錯誤的,因此它符合具有ID的數據庫約定。在'many-to-many'標籤中使用'formula'怎麼樣?是否有一些SQL SELECT語句可以只返回字符串? – PaulH