2011-09-16 2 views
0

NHibernate를 사용하면 user.AddPost(post)post.setAuthor(user)이 같은 방식으로 어떻게 동작합니까? 여기 NHibernate의 양방향 one-to-many 연관

내 클래스입니다 :

var user = new User { 
    Name = "loki2302", 
    Age = 100 
}; 
session.Save(user); 

var post = new Post { 
    Text = "qwerty", 
    Author = user 
}; 
session.Save(post); 

은 또한 수에 인가 :

<class name="User" table="users"> 
    <id name="Id" type="int"> 
    <column name="Id" not-null="true" /> 
    <generator class="native"/> 
    </id> 
    <property name="Name" column="Name" /> 
    <property name="Age" column="Age" /> 
    <set name="Posts" inverse="true"> 
    <key column="AuthorId" /> 
    <one-to-many class="Post" /> 
    </set> 
</class> 

<class name="Post" table="posts"> 
    <id name="Id" type="int"> 
    <column name="Id" not-null="true" /> 
    <generator class="native"/> 
    </id> 
    <property name="Text" column="Text" /> 
    <many-to-one name="Author" column="AuthorId" class="User" /> 
</class> 

실행중인 코드 (잘 작동) : 여기

public class User 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name { get; set; } 
    public virtual int Age { get; set; } 

    private ICollection<Post> _posts = new HashSet<Post>(); 
    public virtual ICollection<Post> Posts 
    { 
     get { return _posts; } 
     set { _posts = value; } 
    } 

    public override string ToString() 
    { 
     return string.Format("User{{id={0}, name='{1}', age={2}}}", Id, Name, Age); 
    } 
} 

public class Post 
{ 
    public virtual int Id { get; set; } 
    public virtual string Text { get; set; } 
    public virtual User Author { get; set; } 

    public override string ToString() 
    { 
     return string.Format("Post{{id={0}, text='{1}', author={2}}}", Id, Text, Author); 
    } 
} 

내 매핑이 이 접근법을 활성화하십시오 (작동하지 않음) :

var user = new User { 
    Name = "loki2302", 
    Age = 100 
}; 
session.Save(user); 

var post = new Post { 
    Text = "qwerty" 
}; 
user.Posts.Add(post); 
session.save(user); 

?

+0

사용자를 생성하는 것과 같은 과정으로 게시물을 만들려고하십니까? Entity 인 경우 사용자 내부에 Post를 작성합니다. 새 사용자 {.. new Post {} ..} – Independent

+0

@Jonas : NHibernate를 배우기 시작했습니다. 두 가지 접근 방식 모두 컴파일 및 실행이 훌륭하지만 약간의 혼란이 있습니다. 좀 더 구체적으로 말하자면, 두 접근법 모두 잘 동작하도록 만들 필요가 있거나, 두 번째 접근법 (작동하지 않음)은 적어도 런타임 오류를 얻고 싶습니다. 그래서 기대했던대로 동작하지 않습니다. 할 것. – agibalov

답변

3

저자 열에 NOT NULL 제약 조건으로 인해 실패했다고 가정합니다. PostAuthor 속성을 설정하지 않으므로 NHibernate는 외래 키 열에 NULL을 삽입합니다.

양방향 관계가 필요한 경우 User.AddPost(Post) 메서드를 만들고 여기에 게시물을 컬렉션에 추가하고 Author 속성을 설정합니다. 당신은 단지 코드 (그러나 Author 참조)에서 컬렉션을해야하는 경우

, 단지 콜렉션 매핑 당신의 inverse="true"를 제거 Author 재산 (및 매핑)을 제거하고 콜렉션 매핑의 key 요소에 not-null="true"를 추가 . 그렇게하면 컬렉션은 Post에서 User의 참조를 처리합니다.

1

사용자 엔티티에 대한 계단식 옵션을 설정해야한다는 것을 이해하는 한.