代码之家  ›  专栏  ›  技术社区  ›  Brandon

在fluent nhibernate中,如何映射以下域模型?

  •  1
  • Brandon  · 技术社区  · 14 年前

    我有一个类似这样的用户类

    public class User
    {
        public virtual int Id { get; set; }
    
        public virtual long ValueA { get; set; }
    
        public virtual int? ValueB { get; set; }
    }
    

    ValueA 由系统自动分配。它用于将映射到 UserClass . 但是,如果valueb的值存在,那么它将查找 用户类 以另一种方式。

    现在我处理它的方法是获取用户,然后每次执行一个单独的查找。

    return user.ValueB.HasValue ? Find(user.ValueB.Value) : Find(user.ValueA);
    

    有没有什么方法可以让fluent nhibernate为我这样做,这样我就可以将user class作为用户类的属性,而不必单独进行查找?我在想componentmap,但我不确定如何使它考虑两个可能的查找值。

    现在,我唯一能想到的另一个解决方案是在返回用户之前,将每个返回语句包装在我的userservice类中以分配用户级别,这不是我想继续使用的解决方案。

    public User Find(long valueA)
    {
        // Get the user
        return AssignUserLevel(user);
    }
    
    public User AssignUserLevel(User user)
    {
        // set the user level of the user
    }
    
    1 回复  |  直到 14 年前
        1
  •  0
  •   Chris Kemp    14 年前

    嗯,这是nhibernate无法处理的一点逻辑(valueb重写valuea),但是您可以让它使用引用,而不是使用id来查找。

    public class User
    {
        public virtual int Id { get; set; }
        public virtual UserClass ValueA { get; set; }
        public virtual UserClass ValueB { get; set; }
        public virtual UserClass UserClass { get { return ValueB ?? ValueA; } }
    }
    
    public class UserMap : ClassMap<User>
    {
        public UserMap()
        {
            Table("MyUserTable");
            Id(user => user.Id).GeneratedBy.Identity();
            References(user => user.ValueA).Not.Nullable();
            References(user => user.ValueB).Nullable();
        }
    }