如何使用动态/运行时条件nHibernate建立从一对多关系的一对一关系

时间:2014-01-12 11:44:15

标签: c# nhibernate fluent-nhibernate

我有以下地图

public class FilmActorMap : ClassMap<FilmActor>
{
    public FilmActorMap()
    {
        Table("film_actor");
        CompositeId()
            .KeyProperty(x => x.ActorId, "actor_id")
            .KeyProperty(x => x.FilmId, "film_id");
        Map(x => x.LastUpdate, "last_update");
        References<Actor>(x => x.Actor, "actor_id"); //.Fetch.Join();
    }
}

public class ActorMap : ClassMap<Actor>
{
    public ActorMap()
    {
        BatchSize(100);
        Id(x => x.ActorId, "actor_id");
        Map(x => x.FirstName, "first_name");
        Version(x => x.Version);
    }
}

在数据库中,我有如下记录

film_actor
**********
film_id | actor_id | last_update
--------------------------------
1       | 100      | x


Actor
*****
actor_id | Version | first_name
-------------------------------
100      | 1       | Antonio
100      | 2       | Antony

启动应用程序后,将向用户显示已完成的修订列表。

如果用户选择

修订版#1:然后选择电影。演员,我想看看版本= 1的记录 即记录“100 1 Antonio”

修订#2: 记录“100 2 Antony”

修订版#3:虽然为此记录没有第3次修订,所以我希望看到最新版本,即记录“100 2 Antony”

无论如何在nHibernate中注入这种动态条件? 另外,我想在批处理模式下获取记录的条件不同。即

SELECT * 
FROM Actor
WHERE (actor_id, Version) in ( SELECT actor_id, Max(Version)
                               FROM Actor
                               WHERE Version <= UserEnteredVersion
                               GROUP BY actor_id)

我不想显式触发查询,而是希望将条件注入现有的映射运行时。这可能在Interceptor中使用吗?

修改#1: 应用程序通过查询加载主模型(这是唯一发出的显式查询),并且当用户在树中导航时,所有其他相关模型通过UI延迟加载。所以我想将where条件注入到Actor引用中以获取所需的actor运行时版本,以便在向下钻取时选择正确的记录。

1 个答案:

答案 0 :(得分:1)

您仍然可以使用普通查询。只需按要求的修订(例如3)减去修订并按第一个条目排序。

相关问题