1

SQL サーバー DB に支えられた .Net サーバー アプリケーションがあります。すべての DB 操作を処理するために nHibernate (流暢) を使用しています。私は深刻なパフォーマンスと同時実行の問題に直面しています。これは明らかに、私が nHibernate と ORM 全般の専門家ではない (詳しくない) という事実に由来しています。

DB に保存する必要があるデータとそうでないデータがあります。たとえば、members class(明らかに DB に永続化する必要がある) があり、logged-in-members class(ランタイム データのみを保持し、永続化する必要がない) もあります。私の例は最善ではないかもしれませんが、私の状況が何であるかを示していると思います。ログイン メンバー オブジェクトには、2 つのクラス間に接続が存在するように、Member 型のプロパティがあります。

一部のクラスの永続化を回避しながら、永続オブジェクトと「メモリ内」オブジェクトの両方で構成される完全なグラフを保持する方法はありますか?

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 に答える