如何将where子句过滤器映射到manymany上

本文关键字:映射 manymany 过滤器 子句 where | 更新日期: 2023-09-27 18:07:13

我在持久化一个字段时遇到了一个问题,这个字段在我的many - many关系上的were子句中,但在类映射上没有显式存在。很难解释,但它是" is_exped "字段在下面的类和映射。

我有以下两个类:

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中的一个或两个中。(不,我不能把过期字段放在Publication上,因为它只对这个特定角色过期——它可能在另一个角色上是当前的)

这个的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();
    }
}

当我对角色进行选择时,Current和Expired Publications将使用正确的Publications填充,但是当我向Current或Expired列表添加新发布时,它总是将is_expired字段保存为0,这是DB中的默认值"is_expired"。

有没有人知道映射这种关系和正确填充"is_expired"字段的正确方法?

谢谢你的帮助

Saan

如何将where子句过滤器映射到manymany上

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