Fluent NHibernate从另一个表加入单列

时间:2010-02-10 15:44:52

标签: join nhibernate fluent

我正在使用Fluent NHibernate并有两个表格;

客户[ID,名称,语言ID]

语言[ID,描述]

我有一个具有以下属性的Customer实体; ID,姓名,语言ID,语言

我想要做的是加入语言表以获取语言描述并将其放在客户实体的语言属性中。

我尝试过使用Join但我无法使用customer表上的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 个答案:

答案 0 :(得分:1)

我之前没有使用过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");
    });

编辑添加:我在联接映射中找到的最佳示例是Ayende's blog。从该示例中,在我看来,join希望映射对象的ID是连接表中的外键。您的模式在映射对象中将连接的表ID作为FK,因此连接将不起作用。我建议创建一个结合客户和语言并映射的视图。

答案 1 :(得分:0)

我认为你可以创建一个语言实体。稍后在实体客户中引用该实体。

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

稍后当您致电您的客户时,您可以决定显示&#34; instance.Language.Description&#34;

例如在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>
}

希望这有帮助。