olarak yabancı bir anahtar haritalama. Önceki yazılar yoluyla aradık ama bulabilirim yakın ilişki .Load için bir öneridir - Ben umuyorum değil ne. Bu .HasForeignKey bağlayıcı ile Entity Framework yapılabilir biliyorum ama Akıcı NHibernate bunu yapmak için bir yol bulmak gibi olamaz.Akıcı NHibernate - Ben iki varlık arasında bir ilişki ekleme ve yabancı anahtar için bir ayarlanabilir Kimlik'i bir yol arıyorum bir özellik
iki örnek varlıkları atın:
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; }
}
Ben Biletin yeni bir örneğini oluşturmak için mümkün istiyorum ve aşağıdaki araçları kullanarak buna bir Hizmetleri atamak (farz olduğunu ilişkili Servis zaten) tablosunda var:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
ServiceId = "Microsoft Word 2012"
};
ne yapmak istemiyorum şudur:
Ticket ticket = new Ticket() {
Title = "Problem with MS Word",
Service = Session.Load<Service>("Microsoft Word 2012")
};
Bunun için geçerli nedenleri var, ve benzeri bu Entity Framework yapılabilir, ama gerçekten Akıcı NHibernate aynı şeyi başarmak için nasıl olarak stumped söyledim. Eşlemlerim şu anda şöyle görünür:
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");
}
}
Herhangi bir yardım her zaman minnettar! Jay için
Sadece hızlı düzenleme - Ben elemanı Session.Load istemiyorum sebebi benim sunum katmanı (MVC 3) NHibernate hakkında bilmeden şey istemiyoruz çünkü - bu nedenle Bir havuz kalıbı kullanarak ve kontrolöre tek bir depo enjekte ederek. Yani, örneğin, ben de sadece Hizmet bir başvuru için almak için bir ServiceRepository enjekte etmek zorunda istemiyorum
public interface IRepository<T>
{
T GetById(object id);
void Create(T entity);
void Update(T entity);
void Delete(T entity);
}
aşağıdaki sözleşme yapışan bir TicketRepository olacak Bilet.
'Session.Load' kullanmak istemediğinden geçerli nedenleri açıklayabilir misiniz? – Jay
@Jay, Terric'in nedenlerinden emin değilsiniz ... ama kaydetmeden önce, IMHO'ya zaten sahip olduğunuz anahtarı referans alabilmek için bir nesneyi yüklemek bazen çok saçma olabilir. Bir önceki projede sıkı bir SLA vardı ve burada da aynı desteği FK desteği almadan önce Entity Framework üzerinde yapmak zorunda kaldık. –
@Jay, yazıyı nedenlerle güncelledi. Ayrıca, Kevin iyi bir noktaya işaret ediyor, ben bunun için bir başka varlık yükleme ekstra yükünü istemiyorum. –