2016-11-14 18 views
0

Ниже приведен мой родственный класс родительских отношений и картограф. Мы используем Nhibernate 4.0.0.4000 в нашем проекте. Когда я вызываю session.Merge (родительский) для обновления родителя, у которого есть новый дочерний объект для вставки в Db. Он не может вставлять исключение Null для code_column в дочерний объект. Кто-нибудь может указать, какая часть кода моего картографа неверна?Nhibernate от одного до многих отношений сложный ключевой вопрос

Public class parent { 
    public virtual string Code { get; set; } 
    public virtual string Desc { get; set; } 
    public virtual IList<Child> Children{ get; set; } 
    public virtual int version {get;set;} 
} 

Public class Child { 
    public virtual parent ParentObj{ get; set; } 
    public virtual string Code1{ get; set; } 
    public virtual string Code2{ get; set; } 
    public virtual int version {get;set;} 
} 


public class ParentMap : ClassMap<Parent> { 
public ParentMap() { 
    Table("Parent_Table"); 
      LazyLoad(); 
      OptimisticLock.Version(); 

    Id(x => x.Code) 
      .Column("Code_Column") 
      .Index("Code_IDX1") 
      .Length(5) 
      .Unique() 
      .GeneratedBy.Assigned() 
      .Not.Nullable(); 

      Version(x => x.Version) 
       .Column("VERS") 
       .UnsavedValue("0"); 

      HasMany(x => x.Children) 
        .AsBag() 
       .KeyColumn("Code_Column") 
       .Inverse() 
       .LazyLoad() 
       .Cascade.All(); 
} 

} 


public class ChildMap: ClassMap<Child> { 
public ChildMap() { 
Table("Child_Table"); 
      LazyLoad(); 
      OptimisticLock.Version(); 

      CompositeId() 
       .KeyReference(u => u.Code, "Code_Column") 
       .KeyProperty(u => u.Code1, "CODE1_column") 
       .KeyProperty(u => u.Code2, "CODE2_column"); 

      Version(x => x.Version) 
      .Column("VERS") 
      .UnsavedValue("0"); 
} 

} 
+0

Во время выполнения у вашего дочернего объекта есть правильная, нулевая ссылка на ее родительскую? –

+0

Привет, Дэвид, спасибо, что спросил, это было правильно во время выполнения. Это был составной идентификатор, который имел проблему с методом session.merge, вероятно, из-за ленивой загрузки. Следующая статья в значительной степени объясняет проблему и разрешение. Я следил за этим, создав отдельный класс для составного Id, и он работал нормально. http://nhibernate.info/blog/2010/06/30/nhibernate-and-composite-keys.html – Babu

ответ

0

Это был сложный идентификатор, который имел проблему с методом session.merge, вероятно, из-за ленивой нагрузки. Когда у вас есть составные клавиши, создайте класс для составных клавиш и используйте их в своей сущности, которая будет работать нормально.