Fluent NHibernate -отображает внешний ключ как свойство

Я ищу способ добавить связь между двумя объектами и иметь устанавливаемый идентификатор для внешнего ключа. Я просмотрел предыдущие сообщения, но самое близкое, что я могу найти, это предложение.Загрузить ассоциацию -, что не то, на что я надеюсь. Я знаю, что это можно сделать в 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 .

6
задан Paul Aldred-Bann 14 August 2012 в 16:50
поделиться