2010-09-03 19 views
7

numaralı kimlikte başvuru başvuruları Ebeveyne kimlik içeren bir alt tablo var. Bu bire bir eşleştirmedir, ancak alt tablodaki değerler eksik olabilir. Bir hata yapmadan bunu haritalamada sorun yaşıyorum ... Birkaç şey denedim;Fluentnhibernate

 
Parent table 
    int id 

Child table 
    int parentid 

Parent class 
    int id 

Child class 
    Parent parent // note I'm referencing parent, not using an int id.. 

Haritalama .. vb farklı özelliklere sahip, aynı sütun haritalama

Id(x => x.Parent) 
    .Column("parentid"); // fails 

Id(x => x.Parent.Id) 
    .Column("parentid"); // fails 

References(x => x.Parent) 
    .Column("parentid"); // fails - missing id 

// Adding an id field in addition to parent for 
// child class (id is then the same as parent.id) 
// fails on save 
Id(x => x.Id) 
    .Column("parentid"); 
References(x => x.Parent) 
    .Column("parentid"); 

ben ayrı Kimliği alanına sahip, ancak ebeveyne ziyade sadece bir referans orada olabildiğince değil çocuk sınıfını istiyorum Asla ebeveyn olmayan bir çocuk olmayın. Ancak veritabanında, yalnızca ebeveynin kimliğini saklamak istiyorum.

Bunu nasıl yapabilirim?

cevap

5

aşağıdaki çalışır:

Id(x => x.Parent.Id).Column("MemberID"); 
References(x => x.Parent).Column("MemberID").ReadOnly(); 

referans SaltOkunur bir istisna

DÜZENLEMEYİ alamadım önemlidir:

Çocuğum sınıfı hala vardı ... o kadar basit değil miydi Id özelliği çağrılıyor. Parent.Id için kimlik başvurusu nhibernate karıştırır ve yerine child.Id çağırmaya çalışır. Çocuğa aşağıdakileri ekledim ve şimdi işe yaramış görünüyor .. Yine de oldukça çirkin bir hack.

public virtual int Id { 
    get { return Parent.Id; } 
    set { Debug.Assert(value == Parent.Id); } 
} 
+0

1 benim için burada çalıştı Dil PT-BR, ama bunu yapmak için daha şık bir yolu var mı? –

0

FluentNHibernate API bu soru başlangıçta sorulduğunda bu sözdizimi sunulmuştu ama bir kompozit id olarak eşlerseniz artık bir kimliğiyle bir başvuru kullanabilirsiniz eğer öyleyse emin değilim yılda değişti. Buna bir korsanlık demezdim, ancak referansı birleşik bir kimliğin parçası olarak ana varlıkla eşleştirmeniz biraz garip. İşte tam bir örnek:

public class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     Table("StackOverflowExamples.dbo.Parent"); 

     Id(x => x.ParentId); 
     Map(x => x.FirstName); 
     Map(x => x.LastName); 
    } 
} 

public class OnlyChildOfParentMap : ClassMap<OnlyChildOfParent> 
{ 
    public OnlyChildOfParentMap() 
    { 
     Table("StackOverflowExamples.dbo.OnlyChildOfParent"); 

     CompositeId().KeyReference(x => x.Parent, "ParentId"); 
     Map(x => x.SomeStuff); 
     Map(x => x.SomeOtherStuff); 
    } 
} 

public class Parent 
{ 
    public virtual int ParentId { get; set; } 
    public virtual string FirstName { get; set; } 
    public virtual string LastName { get; set; } 
} 

public class OnlyChildOfParent 
{ 
    public virtual Parent Parent { get; set; } 
    public virtual string SomeStuff { get; set; } 
    public virtual string SomeOtherStuff { get; set; } 

    #region Overrides 

    public override bool Equals(object obj) 
    { 
     if (obj == null || GetType() != obj.GetType()) 
      return false; 

     var child = obj as OnlyChildOfParent; 

     if (child != null && child.Parent != null) 
     { 
      return child.Parent.ParentId == Parent.ParentId; 
     } 

     return false; 
    } 

    public override int GetHashCode() 
    { 
     return Parent.ParentId; 
    } 

    #endregion Overrides 
} 
0

Belki de this sonrası yardımcı olabilir.
.Cascade.SaveUpdate() ek açıklamalarını kullandım.
Davam her iki tarafta

Obs

Ek açıklamayı koyarak ebeveyn bir hasone oldu:

+0

Bağlantılı cevabın ilgili bölümünü çevirebilirseniz ... –