Я ищу способ добавить связь между двумя объектами и иметь устанавливаемый идентификатор для внешнего ключа. Я просмотрел предыдущие сообщения, но самое близкое, что я могу найти, это предложение.Загрузить ассоциацию -, что не то, на что я надеюсь. Я знаю, что это можно сделать в 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");
}
}
Любая помощь всегда приветствуется!
Просто быстрое редактирование для Джея-причина, по которой я не хочу использовать Session.Load для моего элемента, заключается в том, что я не хочу, чтобы мой уровень представления (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 только для того, чтобы получить ссылку на Service для Ticket .