如何在Fluent NHibernate中将属性映射到第一个?

时间:2010-10-21 04:15:41

标签: nhibernate fluent-nhibernate nhibernate-mapping

给定UserFailedLogin之间的父子关系,其中用户登录失败很多。我想把它映射到

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

2 个答案:

答案 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类产生持久性问题。