Как отобразить свойство первым из многих в Fluent NHibernate? - PullRequest
1 голос
/ 21 октября 2010

Учитывая родительские дочерние отношения между 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();
    }
}

Ответы [ 2 ]

0 голосов
/ 26 сентября 2011

Решение, на котором я остановился, которым я не совсем доволен, состоит в следующем:

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

Это решение обеспечивает загрузку User только одного FailedLogin.Он также правильно обрабатывает сохранение нового неудачного входа в систему, связанного с пользователем.Наконец, это гарантирует, что реализация скрыта от потребителей класса User.К сожалению, это по-прежнему вызывает беспокойство о классе User.

0 голосов
/ 25 марта 2011

Я не вижу прямого решения, но было бы с внутренним списком:

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");
    }
}
...