Я ищу способ добавить связь между двумя объектами и иметь настраиваемый идентификатор для внешнего ключа. Я просмотрел предыдущие сообщения, но самое близкое, что я могу найти, - это предложение. Загрузить ассоциацию - это не то, на что я надеюсь. Я знаю, что это можно сделать в Entity Framework с привязкой .HasForeignKey, но я не могу найти способ сделать это в Fluent NHibernate.
Возьмем два примера сущностей:
public class Ticket
{
public virtual int Id { get; set; }
public virtual string Title { get; set; }
public virtual string ServiceId { get; set; }
public virtual Service Service { get; set; }
}
public class Service
{
public virtual string Id { get; set; }
}
Я хочу иметь возможность создать новый экземпляр Ticket и назначить ему Службу, используя следующие средства (предположим, что связанная Служба уже есть в таблице):
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
ServiceId = "Microsoft Word 2012"
};
Я не хочу делать следующее:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
Service = Session.Load<Service>("Microsoft Word 2012")
};
У меня есть веские причины для этого, и, как я уже сказал, это можно сделать в Entity Framework, но я действительно озадачен тем, как добиться того же в Fluent NHibernate. Мои сопоставления в настоящее время выглядят так:
public class TicketMapping : ClassMap<Ticket>
{
public TicketMapping()
{
Id(m => m.Id);
Map(m => m.Title).Column("Title");
Map(m => m.ServiceId).Column("ServiceId");
HasOne(m => m.Service).ForeignKey("ServiceId");
Schema("dbo");
Table("Tickets");
}
}
public class ServiceMapping : ClassMap<Service>
{
public ServiceMapping()
{
Id(m => m.Id);
Schema("dbo");
Table("Services");
}
}
Любая помощь всегда приветствуется!
Просто быстрое редактирование для Джея - причина, по которой я не хочу сеанс. Загрузить мой элемент, заключается в том, что я не хочу, чтобы мой уровень представления (MVC 3) знал что-либо о NHibernate, поэтому я используя шаблон репозитория и вводя единый репозиторий в контроллер. Так, например, у меня будет TicketRepository, который соответствует следующему контракту
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
Я не хочу вводить ServiceRepository только для того, чтобы получить ссылку на Службу для Билета.
Session.Load
? - person Jay   schedule 14.08.2012Session.Load
не загружает объект; вот почему это метод ссылки на внешний ключ с известным идентификатором. База данных будет поражена только в том случае, если вы попытаетесь получить доступ к свойствам проксируемого объекта. - person Jay   schedule 14.08.2012Session.Load
не загружает объект. Однако, помимо этого, я бы не советовал не допускать попадания NHibernate в ваши контроллеры. NHibernate - это абстракция, и вы отказываетесь от большей части того, что является мощным, если пытаетесь скрыть это. См. ayende.com/blog / 4567 / - person Jay   schedule 14.08.2012