Как сопоставить столбец внешнего ключа в nhibernate?

На самом деле вопрос сложнее, чем его описывают. Я новичок в nhibernate и хочу сопоставить таблицу со столбцами внешнего ключа. В большинстве примеров nhibernate назначения столбцов внешнего ключа обычно реализуются путем установки упомянутой сущности. Я имею в виду, что если у меня есть столбец CategoryId, тогда мне нужно свойство Category, и в образцах, которые я просмотрел, обычно устанавливается свойство Category. В моем случае я хочу устанавливать не свойство сущности, а свойство внешнего ключа.

public class Post
{
    public virtual long Id { get; set; };
    public virtual string Content { get; set; };
    public virtual long CategoryId { get; set; };
    public virtual Category Category { get; set; };
}

Я не хочу устанавливать свойство категории, когда я пытался сохранить объект Post, как в примере ниже.

Post post = new Post { Content = "content", Category = aCategoryEntity };
session.Save(post);

Пример ниже - это то, как я хочу реализовать.

Post post = new Post { Content = "content", CategoryId = 3 };
session.Save(post);

Как мне от этого избавиться?


person Ali Ersöz    schedule 21.05.2009    source источник
comment
Если вы все еще застряли, почему бы также не опубликовать свое отображение.   -  person Mark Dickinson    schedule 21.05.2009


Ответы (3)


Session.Load был решением, которое я использовал здесь.

Post post = new Post 
{ 
   Content = "content", 
   Category = Session.Load<Category>(categoryId)
};

session.Save(post);
person Ali Ersöz    schedule 30.12.2009

Вашему объекту «Сообщение» не нужны и CategoryId, и свойство Category.

Обычно вы также сопоставляете Category, и ваше сопоставление Post будет связывать их с помощью внешнего ключа.

Тогда ты мог бы попробовать что-нибудь подобное

session.Save(new Post(){ Category = new Category(){ Id = 3 } });

Надеюсь это поможет.

person Mark Dickinson    schedule 21.05.2009
comment
Я думаю о вашем предложении, но я ищу для этого точное решение. Кстати, для сопоставлений я использую fluent-nhibernate. Я предполагаю, что есть метод или что-то еще, что я пропустил, который мог бы сделать что-то в этом роде. - person Ali Ersöz; 22.05.2009
comment
Вам нужно подумать об ответе Лиама. Код не может узнать, действителен ли идентификатор категории, поэтому он нарушит внешний ключ и выдаст исключение. - person Mark Dickinson; 22.05.2009
comment
Обычно, когда вы чувствуете, что работаете против технологии, это происходит потому, что это так. Если у вас есть возможность изменить дизайн, чтобы вы могли работать с объектом категории как с свойством Post, это избавит вас от много головной боли. :) - person Mark Dickinson; 22.05.2009
comment
Мне нужно было уговорить коллегу. И я это сделал :) Работа с объектами - правильный способ избавиться от этого. - person Ali Ersöz; 22.05.2009

Я не знаю, возможно ли это для NHibernate. Весь смысл ORM состоит в том, чтобы иметь дело с объектами, а не с внешними ключами RDMS.

person liammclennan    schedule 21.05.2009
comment
Я знаю, что это не лучшая практика, и это исключение для ORM, но мне это все равно нужно. - person Ali Ersöz; 22.05.2009