c# - Fluent NHibernate:ManyToManyでwhere句フィルターをマップする方法

c# nhibernate fluent-nhibernate many-to-many fluent-nhibernate-mapping

ManyToManyリレーションシップのare節にあるフィールドの永続化に問題がありますが、クラスマッピングに明示的に存在しません。説明するのは難しいですが、以下のクラスとマッピングの「is_expred」フィールドです。

次の2つのクラスがあります。

public class Publication
{
    public virtual int Id {get; set;}

    public virtual string Name {get; set;}
}

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

    public virtual IEnumerable<Publication> CurrentPublications {get; set;}

    public virtual IEnumerable<Publication> ExpiredPublications {get; set;}
}


パブリケーションがCurrentPublicationsとExpiredPublicationsのいずれかまたは両方に存在できる場合。 (そして、いいえ、この特定のロールに対してのみ有効期限が切れているため、パブリケーションに期限切れフィールドを配置することはできません-別のロールで最新である可能性があります)

このDBは次のとおりです。

role
{
    role_id     int (PK)
    role_name   varchar(50)
}

role_pub
{
    role_id     int (PK)
    pub_id      int (PK)
    is_expired  bit
}

pub
{
    pub_id      int (PK)
    pub_name    varchar(50)
}


そして、滑らかなマッピング:

public class RoleMapping : ClassMap<Role>
{
    public RoleMapping()
    {
        Table("role");
        Id(x => x.Id, "role_id").GeneratedBy.Identity();
        Map(x => x.Name, "role_name").Not.Nullable();

        HasManyToMany<Publication>(x => x.CurrentPublications)
            .Table("role_pub")
            .ParentKeyColumn("role_id")
            .ChildKeyColumn("pub_id")
            .Where("is_expired = 0")
            .LazyLoad();

        HasManyToMany<Publication>(x => x.ExpiredPublications)
            .Table("role_pub")
            .ParentKeyColumn("role_id")
            .ChildKeyColumn("pub_id")
            .Where("is_expired = 1")
            .LazyLoad();
    }
}


public class PublicationMapping : ClassMap<Publication>
{
    public PublicationMapping()
    {
        Table("pub");
        Id(x => x.Id, "pub_id").GeneratedBy.Identity();
        Map(x => x.Name, "pub_name").Not.Nullable();
    }
}


ロールで選択を行うと、現在のパブリケーションと期限切れのパブリケーションに正しいパブリケーションが入力されますが、新しいパブリケーションを現在のリストまたは期限切れのリストに追加すると、is_expiredフィールドが常に0として保存されます。これは「 is_expired」がDBにあります。

この関係をマッピングし、「is_expired」フィールドに正しくデータを入力する正しい方法について誰かが何か考えを持っていますか?

ご協力いただきありがとうございます

ザーン
答え
SELECTでのみフィルタリングしますが、INSERTでは列を埋めることはありません。 RolePublicationがマップされているクラスis_expiredを導入できます

public class RolePublication
{
    public virtual Role Role {get; set;}
    public virtual Publication Publication {get; set;}
    public virtual bool IsExpired {get; set;}
}

public class Role
{
    ...
    internal protected virtual ICollection<RolePublication> Publications {get; set;}

    public virtual IEnumerable<Publication> CurrentPublications
    { get { return Publications.Where(rp => rp.IsExpired == false).Select(rp => rp.Publication); ) } }

    public virtual IEnumerable<Publication> ExpiredPublications
    { get { return Publications.Where(rp => rp.IsExpired == true).Select(rp => rp.Publication); ) } }
}
関連記事

c# - バインドされたクラスからXmlNode [] 'Any'プロパティにテキストコンテンツ要素を割り当てる最も簡単な方法は?

c# - Win32_PrintJobからページの総数を取得します

c# - LINQクエリ、特定の小数点のある結果を無視

c# - HtmlTextWriter.WriteAttributeを単一引用符で行う方法は?

c# - DbConnection.GetSchema(“ Tables”)は、1つのデータベースのテーブルのみを返します

c# - Facebook C#SDK-壁に投稿

c# - 生成されたデータリーダーを使用したグリッドビューの並べ替えとページング

c# - 順不同のログファイルでの検索

c# - TabControlでの画像の配置に関する問題

c# - このクラスを一般的なクラスに変えることは可能ですか?