簡體   English   中英

流暢的nHibernate - 使用復合鍵映射孩子產生空引用

[英]Fluent nHibernate - Mapping Children with Composite Keys Yielding Null References

給出一個簡單的父 - >子(CK,CK)這樣的設置..我在添加一個新的子對象並獲得父引用時遇到了麻煩。 所以我會以這種方式添加對象..

var parent = new Parent{
  Children = new List<Child>{
   new Child{
     Other = otherReference
   }
  }
};

甚至使用Add()方法添加它...

parent.Children.Add(new Child {Other = other});

Parent的引用沒有得到推進。 它最終只是一個null屬性。 我得到以下異常。

{“無法將值NULL插入列'ParentId',表'mssql_test.Children';列不允許空值.INSERT失敗。\\ r \\ n語句已終止。”}

做到這一點......

new Child { 
   Parent = parentReference,
   Other = otherReference
}

但這似乎有點多余。 我的理解是它應該能夠自己推斷出引用。 如果這是不可能的,也許我只是誤解。 誰能幫我? 我在下面概述了我的代碼。

class Parent {
  int Id { get; set; }
  IList<Child> Children { get; set; }
}
class Other {
  int Id { get; set; }
}
class Child {
  Parent Parent { get; set; }
  Other Other { get; set; }
  // other properties
}

制圖

 ChildMap() {
      CompositeId()
        .KeyReference(x => x.Parent, "ParentId")
        .KeyReference(x => x.Other, "OtherId");
    }

    ParentMap(){
     HasManyToMany(x => x.Children)
                    .AsBag()
                    .ChildKeyColumns.Add(new[] { "ParentId", "OtherId" })
                    .Inverse()
                    .Cascade.All())
                    .Table("[Test]");
}

正如@KeithS指出的那樣,問題是你將Child集合映射為HasManyToMany,它應該是HasMany。 以下是映射的外觀:

  ChildMap() {
      CompositeId() //This is is good
        .KeyReference(x => x.Parent, "ParentId")
        .KeyReference(x => x.Other, "OtherId");
  }

  ParentMap(){ //This is the fix
        HasMany(c => c.Children)
          .Inverse()
          .Cascade.All()
          .KeyColumn("ParentId") //Not needed if Parent Id prop maps to ParentId col
          .Table("[Test]");
  }

您沒有將Parent映射為Child的屬性。 NHibernate(和FluentNH)只映射你告訴他們的內容; 你可以在你的對象上有十幾個字段,但是如果你只映射其中一個字段,這就是NH為你提供實例時所提供的所有字段。 您應該在映射中為Parent添加“References”方法,將Parent的鍵字段指定為FK引用。 這應該為您提供對象層次結構中的“反向引用”。

而且,在Parent方面看起來不是多對多,你應該只有一對多(使用HasMany)。 父母可以有很多孩子,但是孩子只有一個孩子。 ManyToMany可能有效,但它在Parent和Child之間創建了一個冗余的交叉引用表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM