2010-06-17 62 views
1

我有一个用户类,它看起来像这样在功能NHibernate,我将如何映射以下域模型?

public class User 
{ 
    public virtual int Id { get; set; } 

    public virtual long ValueA { get; set; } 

    public virtual int? ValueB { get; set; } 
} 

ValueA是由系统自动分配。它用于映射到UserClass的查找。但是,如果VALUEB值存在,那么它会做的查找了UserClass以不同的方式。

现在我处理它的方式是让用户再进行单独的查询各一次。

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

有没有什么办法,使功能NHibernate为我做到这一点,所以我可以有UserClass的作为User类,而不必单独做查找的属性?我正在考虑ComponentMap,但我不知道如何使它考虑到两个可能的查找值。

眼下唯一的其他的解决办法,我能想到的是包装的每个return语句在我UserService类返回用户,这不是一个解决方案,我想继续牛逼乌斯之前分配用户级别。

public User Find(long valueA) 
{ 
    // Get the user 
    return AssignUserLevel(user); 
} 

public User AssignUserLevel(User user) 
{ 
    // set the user level of the user 
} 

回答

0

嗯,这是一个有点逻辑的是NHibernate的不能处理(VALUEB覆盖值a),但你可以得到它使用引用,而不是使用编号来查找。

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(); 
    } 
} 
+0

感谢您的回答克里斯。 ValueB可以直接映射到其他类,但是ValueA实际上并不是关键值。这只是在搜索中使用的值才能找到合适的UserClass。 – Brandon 2010-06-18 01:55:38