Свободный NHibernate: как отобразить фильтр предложения where на ManyToMany - PullRequest
2 голосов
/ 31 августа 2011

У меня возникла проблема с сохранением поля, которое есть в моем предложении were на выпуске ManyToMany, но не существует в описании классов. Трудно объяснить, но это поле 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;}
}

Где публикация может существовать в одной или обеих текущих публикациях и 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 Ответ

2 голосов
/ 31 августа 2011

, где фильтрует только на 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); ) } }
}
...