2010-02-10 3 views
13

Fluent NHibernate를 사용하고 있으며 두 개의 테이블을 가지고 있습니다.Fluent NHibernate가 다른 테이블의 단일 열을 결합합니다.

고객 [ID, 이름,의 LanguageID]

언어 [ID, 설명] 나는 다음과 같은 특성을 가진 고객 엔티티가

; ID, 이름, 언어 ID, 언어

언어 표에 가입하여 언어 설명을 가져와 고객 항목의 언어 속성에 입력하고 싶습니다.

가입을 사용해 보았지만 고객 테이블의 언어 ID 필드를 사용하여 언어 테이블에 가입 할 수 없습니다. 'ID'를 계속 사용하려고합니다.

내 매핑은 다음과 같습니다.

 Table("Customers"); 
     Not.LazyLoad(); 
     Id(c => c.ID).GeneratedBy.Assigned(); 
     Map(c => c.Name); 
     Map(c => c.LanguageID); 
     Join("Languages", join => 
     { 
      join.KeyColumn("ID"); 
      join.Map(prop => prop.Language).Column("Description"); 
     }); 
+0

https://stackoverflow.com/questions/1241005/how-to-join-table-in-fluent-nhibernate?rq=1 –

답변

1

내가 전에 가입 사용하지 않은하지만 난 당신이 당신의 매핑에 고객의 외래 키 싶은 생각 :

Table("ScriptActivities"); 
    Not.LazyLoad(); 
    Id(c => c.ID).GeneratedBy.Assigned(); 
    Map(c => c.Name); 
    Map(c => c.LanguageID); 
    Join("Languages", join => 
    { 
     join.KeyColumn("LanguageID"); 
     join.Map(prop => prop.Language).Column("Description"); 
    }); 

편집 추가를 : 가장 좋은 예는 내가 매핑이 조인에서 찾을 수 Ayende's blog. 이 예제에서 조인은 조인 된 테이블의 외래 키로 매핑 된 객체의 ID를 기대합니다. 스키마에 조인 된 테이블 ID가 매핑 된 개체의 FK로 있으므로 조인이 작동하지 않습니다. 고객과 언어를 결합한 뷰를 생성하고이를 매핑하는 것이 좋습니다.

+0

아니요 작동하지 않음 - 언어 표에서 LanguageID를 사용하려고 시도하지만, 고객이 아닙니다. 나는 다른 방법으로 라운드해야합니다. – Matt

0

언어에 대한 엔티티를 만들 수 있다고 생각합니다. 나중에 Entity for Customer에서 Entity에 대한 참조를 얻습니다.

public class Customer 
{ 
    public virtual int Id { get; set; } 
    public virtual string Name{ get; set; } 
    public virtual Language Language { get; set; } 
} 

그런 다음 CutomerMap에 당신은 수행해야합니다

public class CustomerMap : ClassMap<Customer> 
{ 
    public CustomerMap() 
    { 
     Id(x => x.Id); 
     Map(x => x.Name); 
     References(x => x.Language); 
    } 
} 

을 나중에 당신이 쇼 MVC에서 예를 들어, "instance.Language.Description"

를 결정할 수 있습니다 당신의 costumers를 호출 할 때,에 당신이 할 수있는 컨트롤러 :

public ActionResult Index() 
    { 
     using (ISession session = NHibernateHelper.OpenSession()) 
     { 
      var customers = session.Query<Customer>().Fetch(x => x.Language).ToList(); 
      return View(customers); 
     } 
    } 

그리고보기 :

@foreach (var item in Model) { 
<tr> 
    <td> 
     @Html.DisplayFor(modelItem => item.Name) 
    </td> 
    <td> 
     @Html.DisplayFor(modelItem => item.Language.Description) 
    </td> 
    <td> 
     @Html.ActionLink("Edit", "Edit", new { id=item.Id }) | 
     @Html.ActionLink("Details", "Details", new { id=item.Id }) | 
     @Html.ActionLink("Delete", "Delete", new { id=item.Id }) 
    </td> 
</tr> 
} 

희망이 있습니다.

관련 문제