流畅的NHibernate:如何在ManyToMany上映射where子句过滤器

时间:2011-08-31 14:38:56

标签: c# nhibernate fluent-nhibernate many-to-many fluent-nhibernate-mapping

我遇到了一个问题,即在一个关于ManyToMany关系的my子句中持久存在一个字段,但是在类映射中没有明确存在。很难解释,但它在下面的类和映射中是“is_expred”字段。

我有以下两个类:

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中的任何一个或两者中。 (不,我不能把过期的字段放在出版物上,因为它只对这个特定的角色过期了 - 它可能是当前不同的角色)

这个数据库是:

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”的值。

有没有人知道如何正确映射这种关联并正确填充“is_expired”字段?

感谢您的帮助

Saan

1 个答案:

答案 0 :(得分:2)

其中仅过滤 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); ) } }
}