给定User
和FailedLogin
之间的父子关系,其中用户登录失败很多。我想把它映射到
class User
{
public virtual FailedLogin LastFailedLogin { get; set; }
}
class FailedLogin
{
public virtual User User { get; set; }
public virtual DateTime AttemptOn { get; set; }
}
以便LastFailedLogin
属性包含FailedLogin
,其中包含最新的AttemptOn
日期和时间。如果设置了LastFailedLogin
,则应将FailedLogin
保存到数据库(即.Cascade.SaveUpdate()
)注意,出于性能原因,我不想为此用户映射所有FailedLogins的集合
我完全无法为此编写流畅的映射。如何使用Fluent NHibernate进行映射?
public class UserMap : ClassMap<User>
{
public UserMap()
{
// What goes here for LastFailedLogin?
}
}
public class FailedLoginMap: ClassMap<FailedLogin>
{
public FailedLoginMap()
{
References(x => x.User).Not.Update();
Map(x => x.AttemptOn).Not.Update();
}
}
答案 0 :(得分:0)
我看不到直接的解决方案,但会有一个内部列表:
class User
{
internal virtual IList<FailedLogin> LastFailedLogins { get; set; }
public virtual FailedLogin LastFailedLogin { get { LastFailedLogins.FirstOrDefault(); } set { LastFailedLogins.Insert(0, value); } }
}
public class UserMap : ClassMap<User>
{
public UserMap()
{
HasMany(u => u.LastFailedLogins)
.OrderBy("AttemptOn desc");
}
}
答案 1 :(得分:0)
我确定的解决方案是:
,我并不完全满意public class User
{
private readonly IList failedLogins;
public virtual FailedLogin LastFailedLogin
{
get
{
return failedLogins.FirstOrDefault();
}
set
{
failedLogins.Clear();
failedLogins.Add(value);
}
}
}
public class UserMap : ClassMap<User>
{
HasMany(Reveal.Member<User, IEnumerable<FailedLogin>>("failedLogins"))
.Where("FailedLoginID=(SELECT TOP 1 a.FailedLoginID FROM FailedLogin AS a " +
"WHERE a.UserID = UserID ORDER BY a.AttemptOn DESC)")
.Cascade.SaveUpdate().Access.CamelCaseField().Inverse();
}
此解决方案可确保只有一个FailedLogin
加载User
。它还可以正确处理与用户关联的新失败登录。最后,它确保实现对User
类的使用者隐藏。不幸的是,这仍然会对User
类产生持久性问题。