У меня есть приложение на 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
.