2011-03-21 4 views
0
나는 다음과 같은 수업을

을 통해 개체의 부모에 접근 :자 NHibernate는 - ID 또는 객체 참조

public class Parent 
{ 
    public virtual int ParentId { get; set; } 
    public virtual string Name { get; set; } 
    public virtual ICollection<Child> Children { get; set; } 
} 

public class Child 
{ 
    public virtual int ChildId { get; set; } 
    public virtual string Name { get; set; } 
    //public virtual int ParentId { get; set; } 
    public virtual Parent Parent { get; set; } 
} 

이러한 클래스는 일대 다 관계에있는 데이터베이스에 해당 테이블에 매핑됩니다. 내 매핑 클래스에서, 나는 다음을 수행하십시오

using FluentNHibernate.Mapping; 
public partial class ParentMap : ClassMap<Parent> 
{ 
    public ParentMap() 
    { 
     Id(p => p.ParentId).Column.("PARENT_ID").GeneratedBy.Native(); 
     Map(p => p.Name).Column("PARENT_NAME").Not.Nullable(); 
     HasMany<Child>(p => p.Children).Cascade.All().LazyLoad().Inverse().AsSet(); 
    } 
} 

public partial class ChildMap : ClassMap<Child> 
{ 
    public ChildMap() 
    { 
     Id(c => c.ChildId).Column("CHILD_ID").GeneratedBy.Native(); 
     Map(c => c.Name).Column("CHILD_NAME").Not.Nullable(); 
     References<Parent>(c => x.Parent).Column("PARENT_ID").Not.LazyLoad().Not.Nullable(); 
    } 
} 

나는이 작업을 수행 할 수 있도록 하위 클래스에서 노출 (위의 클래스 정의의 행의 주석을 해제)하는 ParentId 속성을 할 수있을 필요가있는 무엇 다음

입니다
var child = new Child(); 
child.ParentId = 1; 

, 나는 여전히 child.Parent 속성을 통해 부모에 액세스 할 수있는 동안 child.ParentId 속성을 통해 아이에게 부모를 부착 할 수 있어야합니다. 예 :

// i currently have to do the following in order to link the child with 
// the parent when I update an existing Child instance (ParentService() and 
// ChildService() are service classes that sit between my applications and 
// NHibernate). 
var parentService = new ParentService(); 
var parent = parentService.GetById(1); 
var child = new Child() { ChildId = 2, Parent = parent, Name = "New Name" }; 
var childService = new ChildService(); 
childService.Save(child); 

// in a different project, i access the Parent object via the child's 
// Parent property 
var childService = new ChildService(); 
var child = childService.GetById(2); 
Console.WriteLine(child.Parent.Name); 


// i want to do this instead 
var child = new Child() { Id = 2, ParentId = 1, Name = "New Name" }; 
var childService = new ChildService(); 
childService.Save(child); 
Console.WriteLine(child.Id); // 11 

// [ ... ] 

var childService = new ChildService(); 
var child = childService.GetById(2); 
Console.WriteLine(child.Parent.Name); 

어떻게해야 매핑이 변경 될까요? TIA, NHibernate에의 올바른 사용법이 아니다

랄프 톰슨

답변

4

. ,

var parentId = child.Parent.Id; //this does not cause loading 

이드에 의해 부모를 설정하려면 내 목적을 제공 할 수

child.Parent = session.Load<Parent>(parentId); //this never goes to the DB either 
+0

사용

부모 사용의 ID를 얻으려면. 나는 그걸 가지고 놀아야하고 그것을 어떻게 사용할 수 있는지보아야 할 것입니다. 고맙습니다. –