Szukam sposobu dodawania powiązania między dwoma obiektami i posiadania ustawialnego identyfikatora dla klucza obcego. Przeszukałem poprzednie posty, ale najbliżej mogę znaleźć sugestię. Opowiedz o stowarzyszeniu - na co nie mam nadziei. Wiem, że można to zrobić w Entity Framework z wiązaniem .HasForeignKey, ale nie mogę znaleźć sposobu na to w Fluent NHibernate.Fluent NHibernate - mapowanie klucza obcego jako własności
Weźmy dwa przykładowe podmioty:
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; }
}
Chcę móc utworzyć nową instancję Biletu i przypisać usługi do niego stosując następujące środki (zakładamy, że związane usługi już istnieje w tabeli):
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
ServiceId = "Microsoft Word 2012"
};
Co nie chcę zrobić jest następujący:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
Service = Session.Load<Service>("Microsoft Word 2012")
};
mam uzasadnione powody do tego, a jak mówiłem, można to zrobić w Entity Framework, ale jestem bardzo zakłopotany, jak osiągnąć to samo w Fluent NHibernate. Moje mapowania obecnie wyglądają tak:
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");
}
}
Każda pomoc zawsze doceniana!
Tylko szybka edycja dla Jay - powodem, dla którego nie chcą Session.Load mój żywioł to dlatego, że nie chcą mojego warstwy prezentacji (MVC 3) wiedząc nic o NHibernate - dlatego m używa wzorca repozytorium i wstrzykuje do kontrolera jedno repozytorium. Tak na przykład, będę mieć TicketRepository która przylega do następnego zamówienia
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
nie chcę mieć do wstrzyknąć ServiceRepository również po to, żeby odniesienie do dla SłużbyBilet.
Czy możesz opracować uzasadnione powody, dla których nie chcesz używać 'Session.Load'? – Jay
@Jaj, nie jestem pewien co do przyczyn Terricka ... ale czasami może być śmieszne, aby załadować obiekt tylko po to, aby móc odwołać się do klucza, który masz już przed zapisaniem, IMHO. Mieliśmy ścisłą umowę SLA dotyczącą wcześniejszego projektu, w którym musieliśmy wykonać to samo obejście w Entity Framework, zanim otrzymaliśmy wsparcie FK. –
@Jam zaktualizowałem mój wpis z przyczyn. Poza tym Kevin ma rację, nie chcę dodatkowego obciążenia związanego z ładowaniem innej jednostki dla tego powiązanego. –