NHibernate: исключение «Не удалось определить тип» - PullRequest
1 голос
/ 05 октября 2011

У меня есть приложение на C # .NET 3.5, использующее NHibernate для сопоставления объектов с базой данных MySQL.

Таблицы MySQL связывают тестовый набор с файловым сервером.Существует промежуточная таблица, которая определяет, используется ли данный сервер для файлов тестовых случаев или результатов.

testcase { TestCaseID }
testcase_servers { TestCaseServerID, ResultServerID, FileServerID, TestCaseID }
file_server { [INT(11)]ServerID, [VARCHAR(45)]Username, [VARCHAR(45)]Password, [VARCHAR(45)]Address }

В коде C # у меня нет промежуточного класса.

class TestCase
{
    public virtual int Id { get; set; }

    // other properties ommitted for brevity

    public virtual Server Server { get; set; }
}

class Server
{
    public virtual int Id { get; set; }
    public virtual string Address { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }
}

Сопоставление, которое я пытаюсь использовать для этого, использует формулу для сопоставления правильного сервера с TestCase.

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MyApplication"
                   namespace="MyProject">

    <class name="Server" table="file_server">
        <id name="Id" column="ServerID" type="int" >
            <generator class="native"/>
        </id>
        <property name="Address"/>
        <property name="Username"/>
        <property name="Password"/>
    </class>
</hibernate-mapping>

<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="MyApplication"
                   namespace="MyProject">

    <class name="TestCase" table="testcase">
        <id name="Id" column="TestCaseID" type="int" >
            <generator class="native"/>
        </id>
        <property name="Server" type="Server" formula="(SELECT file_server.* FROM testcase_servers, file_server WHERE testcase_servers.ResultServerID = file_server.ServerID AND testcase_servers.TestCaseID = Id)">
        </property>
    </class>
</hibernate-mapping>

Но я получаю исключение:

Could not determine type for: MyProject, MyApplication, for columns: NHibernate.Mapping.Formula( (SELECT queue_file_server.* FROM queue_tc_servers, queue_file_server WHERE queue_tc_servers.ResultServerID = queue_file_server.ServerID AND queue_tc_servers.TestCaseID = Id) )

Как мне сопоставить сервер с тестовым набором, не создавая другой объект для промежуточной таблицы?

Спасибо, PaulH

Редактировать: I 'мы пытались сделать Server IUserType

class Server : IUserType
{
    public virtual int Id { get; set; }
    public virtual string Address { get; set; }
    public string Username { get; set; }
    public string Password { get; set; }

    // IUserType Members (some ommitted for brevity)

    public NHibernate.SqlTypes.SqlType[] SqlTypes
    {
        get
        {
            return new SqlType[] {
                new SqlType(DbType.Int32),
                new SqlType(DbType.String),
                new SqlType(DbType.String),
                new SqlType(DbType.String),
            };
        }
    }
}

Теперь я получаю MappingException Property mapping has wrong number of columns: MyProject.TestCase.Server type: Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...