C# NHibernate:多对多映射异常

C# NHibernate:多对多映射异常,c#,mysql,nhibernate,C#,Mysql,Nhibernate,我有一个使用NHibernate和MySQL的c#.NET3.5应用程序 我的SQL表以多对多模式排列,将配置字符串链接到任务 CREATE TABLE `configstring` ( `ConfigStringID` int(11) NOT NULL AUTO_INCREMENT, `ConfigString` varchar(45) NOT NULL, PRIMARY KEY (`ConfigStringID`) ) ENGINE=InnoDB DEFAULT CHARSET=

我有一个使用NHibernate和MySQL的c#.NET3.5应用程序

我的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; }
}
<?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>
公共类任务
{
公共虚拟IList配置字符串{get;set;}
}
此类到数据库的NHibernate XML映射如下所示:

public class Task
{
    public virtual IList<string> ConfigurationStrings { get; set; }
}
<?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()
时,我得到一个异常:
来自表任务的关联\u configstring没有指定引用的实体


系统.String
对象进行多对多映射的正确方法是什么?

您有ConfigString的类吗

在多对多映射中缺少类名

创建新的ConfigString实体:

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

   public virtual string ConfigString { get; set; }
}

<many-to-many class="ConfigStringEntity" column="ConfigStringID"/>
类ConfigStringEntity
{
公共虚拟int ConfigStringID{get;set;}
公共虚拟字符串ConfigString{get;set;}
}
然后,您的列表将是ConfigStringEntity的列表

public class Task
{
    public virtual IList<ConfigStringEntity> ConfigurationStrings { get; set; }
}
公共类任务
{
公共虚拟IList配置字符串{get;set;}
}

该类是一个System.String。我只需要
ConfigString
列中的字符串除非我弄错了,否则您仍然需要ConfigString的实体,然后您将在多对多关系中使用它。必须创建一个类来包装字符串以使其符合具有ID的数据库约定,这似乎是错误的。在
多对多
标记中使用
公式
如何?是否有一些SQL SELECT语句可以只返回字符串?或者,是否有一种方法可以为持久类创建xml,而不是在c#中创建类?我同意这似乎有些过分,但我不确定是否有其他方法。我四处搜索,唯一一篇提到多对多映射中公式的文章可以追溯到2006年,它提到它不受支持。我无意中发现了这篇关于Hibernate的文章,它支持他们。。。也许从那时起他们就把它搬走了: