13

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

客户 [ID、姓名、LanguageID]

语言 [ID,描述]

我有一个具有以下属性的客户实体;ID、姓名、语言ID、语言

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

我曾尝试使用 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");
        });
4

2 回答 2

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 的博客。从该示例中,在我看来,连接期望映射对象的 ID 是连接表中的外键。您的架构将连接表 ID 作为映射对象中的 FK,因此连接不起作用。我建议创建一个结合客户和语言的视图并对其进行映射。

于 2010-02-11T20:49:57.253 回答
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);
    }
}

稍后当您致电客户时,您可以决定显示“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>
}

希望这可以帮助。

于 2016-03-01T20:15:57.960 回答