2010-02-10 2 views
13

Я использую Fluent NHibernate и имею две таблицы;Fluent NHibernate присоединяется к одному столбцу из другой таблицы

клиентов [ID, имя, LanguageID]

Языки [ID, Описание]

У меня есть объект клиента со следующими свойствами; ID, имя, языкID, язык

Что я хотел бы сделать, так это присоединиться к таблице «Языки», чтобы получить описание языка и поместить его в свойство языка объекта клиента.

Я попытался использовать Join, но я не могу заставить его использовать поле LanguageID в таблице клиентов, чтобы присоединиться к таблице языков - он все еще хочет использовать «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. Из этого примера мне кажется, что соединение ожидает, что идентификатор сопоставленного объекта будет внешним ключом в объединенной таблице. Ваша схема имеет объединенный идентификатор таблицы как FK в сопоставленном объекте, поэтому соединение не будет работать. Я предлагаю создать представление, объединяющее клиент и язык и отображающее его.

+0

Нет, что не работает - он пытается использовать LanguageID в таблице Languages, не Клиенты. Мне нужно, чтобы это было наоборот. – 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); 
    } 
} 

Позже, когда вы звоните своим костюмеров вы можете решить показать "instance.Language.Description"

Например, в MVC, в контроллер вы можете сделать:

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> 
} 

Надеюсь, что это поможет.

Смежные вопросы