Я начал использовать NHibernate сегодня, но не могу понять, как настроить простое отношение между двумя таблицами.Я действительно не знаю, как это называется, это может быть отношение «один ко многим» или «внешний ключ» (я не имею в виду дизайн базы данных и используемые термины), но вот очень простой пример.
У меня есть таблица Product с атрибутами Id (PK), ProductName и CategoryId.Затем у меня есть таблица Категории с атрибутами Id (PK) и CategoryName.
Я создал эти классы:
public class Product
{
public virtual int Id { get; set; }
public virtual string ProductName { get; set; }
public virtual int CategoryId { get; set; }
public virtual Category Category { get; set; }
public virtual string CategoryName
{
get { return this.Category == null ? String.Empty : this.Category.CategoryName; }
}
}
public class Category
{
public virtual int Id { get; set; }
public virtual string CategoryName { get; set; }
}
Другими словами, я просто хочу, чтобы Продукт сохранял, к какой категории он относитсяпринадлежит (через атрибут CategoryId, который указывает на Id в таблице категорий).Мне не нужен класс Category для хранения списка связанных продуктов, если это делает его еще проще.
Чтобы еще яснее понять, что я хочу, этоSQL, который я ожидаю:
SELECT Products.*, Categories.*
FROM Products INNER JOIN Categories ON Products.CategoryId = Categories.Id
по крайней мере, это то, что, как я думаю, должно быть (опять же, я не очень хорош в проектировании баз данных или запросах).
Я могу 'не могу понять, какой вид картографии мне нужен для этого.Я полагаю, мне нужно сопоставить его в файле Product.hbm.xml.Но я также сопоставляю CategoryId?И как мне сопоставить свойство категории?
Кажется, мне нужно отношение «один ко многим», поскольку у меня есть ОДНА категория для каждого продукта (или это рассуждение в обратном направлении?), Но, похоже, нет сопоставления «один ко многим»...
Спасибо за любую помощь!
Добавление:
Я пытался добавить отношение «многие к одному» в сопоставлении «Персона», но получаю исключение, говорящее «Ошибка создания прокси», иво внутреннем исключении «Неопределенное совпадение найдено».
Я должен упомянуть, что я использую старую версию NHibernate (1.2, я думаю), потому что это единственная версия, которую я запустил с MS Access из-за того, что она не нашлаJetDriver в более новых версиях.
Я поместил файлы сопоставления, классы и код, где ошибка возникает на скриншотах, потому что я не могу понять, как разместить XML-код здесь ... Он продолжает читать егокак теги HTML и пропуская половину.Во всяком случае.
Отображения:
http://www.nickthissen.nl/Images/tmp7B5A.png
Классы:
http://www.nickthissen.nl/Images/tmpF809.png
Код загрузки, где происходит ошибка:
http://www.nickthissen.nl/Images/tmp46B6.png
(Как я уже говорил, внутреннее исключение говорит: «Найдено неоднозначное совпадение».
(Продукт в моем примере заменен на Person)
Классы Person и Category наследуют Entity, который является абстрактным базовым классом и определяетСвойства Id, Deleted, CreatedTime и updatedTime. Код, в котором происходит ошибка, находится в универсальном классе 'manager' (параметр типа TEntity, который должен наследовать Entity). Он просто должен загружать все объекты с атрибутом Deleted false. В этом случае, TEntity - это «Person».
Работает нормально, если я опускаю отображение категории «многие к одному» в отображении Person, но, очевидно, свойство Category всегда имеет значение null.
Ohда, извините за смесь между C # и VB, код C # находится в общей структуре, которую я использую для нескольких проектов, в то время как часть VB - фактическая реализация этой структуры намой сайт и я только что использовали VB для этого.
Помогите?Спасибо!