5

次のような単純なスキーマがあります。

アイデアは、ユーザー、部門、およびフローがあるということです。部門ごとに、ユーザーは複数のフローに「スター」を付けて「ブックマーク」することができます (したがって、部門/ユーザーのペアは多くのフローを持つことができます)。

理想的には、次のクラスを使用したいと思います。

public class User
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
}

public class Department
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }
    public virtual IDictionary<User, IList<StarredFlow>> StarredFlows { get; protected set; }

    public Department()
    {
        this.UserStarredFlows = new Dictionary<User, IList<StarredFlow>>();
    }
}

public class Flow
{
    public virtual int Id { get; protected set; }
    public virtual string Name { get; set; }

    protected Flow() { }
}

public class StarredFlow
{
    public virtual int Id { get; protected set; }
    public virtual User User { get; protected set; }
    public virtual Department EntryPoint { get; protected set; }
    public virtual Flow Flow { get; protected set; }
    public virtual string Name { get; protected set; }

    protected StarredFlow() { }

    public StarredFlow(User user, Department ep, Flow flow, string name)
    {
        this.User = user;
        this.EntryPoint = ep;
        this.Flow = flow;
        this.Name = name;
    }
}

これにより、かなりリテラルなコードが可能になります。

var userStarredFlowsForDepartment = department.StarredFlows[currentUser];

ただし、NHibernate はリストのマッピング辞書をサポートしていません。を新しいクラスに移動し、コンポーネントを使用してマッピングすることを含む同様の質問/回答を見つけました。IList<StarredFlow>悲しいことに、FluentNHibernate はコンポーネントを使用したコレクション マッピングの実行をサポートしていません (HasManyコンポーネント マッピングのオフはありません)。

これは NHibernate で行うのは些細なことのように思えますが、解決策を見つけるのに苦労しています。これを行うためのより良い解決策はありますか? モデルの外にロジックを移動するので、andを使用するだけに解決する必要はありませんsession.Save(starredFlow)Query<StarredFlow>()

4

1 に答える 1

0

あなたがやりたいことは間違いなくサポートされていません。理論的に有効な設計ではないと言っているわけではありませんが、NHibernate はそれをサポートしておらず、将来もそうなる可能性は低いです。

とはいえDepartment、辞書の代わりにいつでもメソッドを使用できIQueryableます。

public IEnumerable<StarredFlow> GetUserStarredFlows(IQueryable<StarredFlow> source,
                                                    User user)
{
    return source.Where(x => x.User == user)
                 .ToList(); //you could skip this depending on your usage
}

または (もう少し複雑)IQueryableまたは セッションを注入することもできます。

于 2012-08-21T21:34:15.620 に答える