1

我有一个由 SQL 服务器数据库支持的 .Net 服务器应用程序。我正在使用 nHibernate (fluent) 来处理所有数据库操作。我面临着严重的性能和并发问题,这显然是因为我不是一般的 nHibernate 和 ORM 专家(甚至不是专家)。

我有一些需要存储在数据库中的数据和一些不需要的数据。例如,我有members class(显然需要在数据库中持久化),我也有logged-in-members class(它只保存运行时数据,不需要持久化)。也许我的例子不是最好的,但我认为它说明了我的情况。登录成员对象将具有成员类型的属性,以便两个类之间存在连接。

有什么方法可以避免持久化某些类,但仍然能够拥有一个完整的图形,由持久性和“内存中”对象组成?

4

1 回答 1

0

我不确定对象图的样子,但为什么不让会话弄清楚发生了什么变化?

void DoSomethingWithMembers()
{
    // if session which loaded the members is not open anymore
    foreach (var member in loggedInMembers.Select(loggedInMember => loggedInMember.Member))
    {
        session.Lock(member, LockMode.None); // reattach to session
    }
    // end if

    // make changes to the (loggedIn)members

    session.Flush(); // will persist any changes to a member
}

更新:作为对评论的回应,类似这样

public AuthenticationResult Authenticate(string username, string password)
{
    if (loggedInUsers.ContainsKey(username))
        return AuthenticationResult.AlreadyLoggedIn;

    using (var session = OpenSession())
    {
        var member = session.Query<Member>().Where(m => m.Name == username).FirstOrDefault();
    }

    if (member == null)
        return AuthenticationResult.NoUser;

    if (member.Password != password)
        return AuthenticationResult.WrongPassword;

    loggedInUsers.Add(username, new LoggedInMember(DateTime.Now, member));

    var dto = mapper.Map<Member, MemberDto>(member);
    return new AuthenticationResult(dto);
}

public void Update(ICollection<MemberDto> dtos)
{
    using (var session = OpenSession())
    {
        foreach (var dto in dtos)
        {
            Update(session, dto);
        }
        session.Flush();
    }
}

void Update(ISession session, MemberDto dto)
{
    LoggedInMember liMember;
    if (!loggedInUsers.TryGetValue(dto.Name, out liMember)
        throw new AuthException("not logged in")

    session.Lock(li.Member, LockMode.None); // attach

    mapper.Map<Member, MemberDto>(li.Member, dto);
}
于 2012-10-23T10:29:42.353 回答