Свободное соединение NHibernate с одним столбцом из другой таблицы - PullRequest
13 голосов
/ 10 февраля 2010

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

Клиент [ID, Имя, LanguageID]

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

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

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

Я пытался использовать Join, но не могу заставить его использовать поле LanguageID в таблице клиентов для присоединения к таблице Languages ​​- он все еще хочет использовать '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");
        });

Ответы [ 2 ]

1 голос
/ 11 февраля 2010

Я раньше не использовал Join, но я думаю, что вам нужен внешний ключ от Customer в вашем отображении:

    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");
    });

Отредактировано, чтобы добавить: Лучший пример, который я мог найти в отображении соединения, это Блог Айенде .Из этого примера мне кажется, что объединение ожидает, что идентификатор сопоставленного объекта будет внешним ключом в объединенной таблице.Ваша схема имеет идентификатор объединенной таблицы как FK в сопоставленном объекте, поэтому объединение не будет работать.Я предлагаю создать представление, объединяющее Customer и Language и отображающее это.

0 голосов
/ 01 марта 2016

Я думаю, вы можете создать Entity for Language. Позже в 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>
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...