2

ManyToMany関係のwere句にあるフィールドを永続化する際に問題が発生しましたが、クラスマッピングに明示的に存在していません。説明するのは難しいですが、以下のクラスとマッピングの「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として保存されます。これはデフォルト値の「」です。 DBのis_expired」。

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

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

サーン

4

1 に答える 1

2

SELECTフィルタリングするだけで、INSERTの列を埋めることはありません。マップされたクラスを導入できますRolePublicationis_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); ) } }
}
于 2011-08-31T15:21:09.783 に答える