2013-07-13 27 views
6

Sorum şu: Ana Nesne nesnesi için Alt öğe nesnesini gerektirmeyen Anne-Baba nesneleri için olası bir Fluent NHibernate eşlemesi var mıdır? Referansı Ebeveyne nasıl eşleştireceğimi anlayamadım. Eşlemlerle oluşturulduğu gibi çağırdığımda, bir istisna alıyorum çünkü alt nesne (veri deposunda gerekli) gerekli yabancı anahtara sahip değil.Nesne özelliği olmadan Fluent NHibernate öğesinde yabancı anahtarı eşleştirin

İki POCO sınıfları:

public class Parent 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual IList<Child> Childs { get; set; } 
} 

public class Child 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int ParentId { get; set; } 
} 

Ve bazı eşleştirmeler:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     this.Table("Parents"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.HasMany(x => x.Childs).KeyColumn("ChildId").Cascade.AllDeleteOrphan(); 
    } 
} 

public class ChildMap : ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     this.Table("Childs"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     // Needs some sort of mapping back to the Parent for "Child.ParentId" 
    } 
} 

Ve yöntemi oluşturun: Bir Veli nesne oluşturmak mümkün olmak istiyorum

public Parent Create(Parent t) 
{ 
    using (this.session.BeginTransaction()) 
    { 
     this.session.Save(t); 
     this.session.Transaction.Commit(); 
    } 
    return t; 
} 

o Child nesnelerinin bir listesini içerir, ancak Child nesnelerinin Ana Babalarına (Ana Kimlikten başka) geri göndermeleri gerekmez. Bunu yapmak için bunu yapmak istiyorum. Bunu yapmak için, Parent'ten, Parent nesnesine geri dönen Childs listesindeki döngüsel başvuruyu önlemek için JSON serileştirmesiyle ilgili sorunlara neden olmak istiyorum.

+0

Ebeveyn özelliğini ('Child') özel bir alana bir seçenekle eşleştiriyor mu? –

+0

Yaptığım şey bu, bundan kaçınmaya çalışıyorum, çünkü "ParentId" özelliğindeki sorguları çalıştıramıyorum. Görünüşe göre, bir özelliği bir nesneye gerek duymadan bir sütuna yabancı anahtar kısıtlamasıyla eşleştirebilmem gerekiyor ... –

+0

Orijinal soru söz konusu olduğunda, Felipe'nin cevabı doğru. Varlıkları doğrudan seri hale getirmeyin, önce bir DTO veya ViewModel'e dönüştürün, önce istediğiniz yapıyı elde edin. –

cevap

3

Sen sorunsuz bu varlıkları haritalayabilirsiniz, şunu deneyin: Eğer ISession gelen varlıkları olsun bu yerine nhibernate kişiler nesnelerin vekiller olabilir çünkü

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     this.Table("Parents"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.HasMany(x => x.Childs).KeyColumn("ChildId").Cascade.AllDeleteOrphan(); 
    } 
} 

public class ChildMap : ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     this.Table("Childs"); 
     this.Id(x => x.Id); 
     this.Map(x => x.Name); 
     this.Map(x => x.ParentId); 
     // if you have a reference of Parent object, you could map as a reference, for sample: 
     this.References(x => x.Parent).Column("ParentId"); 
    } 
} 

, bazı biçime serialize yoktur. DTO (Data Transfer Object) classes oluşturmayı deneyin ve bu varlıkları DTO nesnesine dönüştürün ve serileştirin. Dairesel referanslardan kaçınacaksınız. örneği için: numune için,

var dto = ISession.Query<Parent>() 
        .Select(x => 
         new ParentDTO() { 
          Id = x.Id, 
          Name = x.Name, 
          ParentId = x.ParentId) 
        .ToList(); 

Veri Erişim Katmanı bu sonucu almak ve seri hale getirilmeye açmaya:

public class ParentDTO 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public int ParentId { get; set; } 

    /* here you just have the primitive types or other DTOs, 
     do not reference any Entity type*/ 
} 

Ve tefrika değerini paylaşma değerleri okumak için gerektiğinde

var result = Serialize(dto); 
+1

Cevabınızın yanıt vermediği kritik bir parça 'ParentId' özelliği, 'Ana' nesnesinin' Id 'özelliğinde bir yabancı anahtar kısıtlaması olmalıdır. Sen sadece harita yaptın, bu yüzden üzerinde hiçbir kısıtlama yok. –

+0

Sizinle katılıyorum @PatrickQuirk, ancak sağlanan OP, bir referansa sahip değil modelinde, sadece bir 'Id'. –