.net 混合持久数据和易失数据

.net 混合持久数据和易失数据,.net,nhibernate,orm,persistent,.net,Nhibernate,Orm,Persistent,我有一个由SQL server DB支持的.Net server应用程序。我使用nHibernate(fluent)来处理所有的数据库操作。我面临着严重的性能和并发性问题,这显然是因为我不是nHibernate和ORM方面的专家(甚至不是专家) 我有些数据需要存储在数据库中,有些数据不需要。例如,我有成员类(显然需要在数据库中持久化),我还有登录成员类(只保存运行时数据,不需要持久化)。也许我的例子不是最好的,但我认为它说明了我的情况。登录的成员对象将具有类型为member的属性,以便两个类之间

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

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


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

我不确定对象图形是什么样子,但为什么不让会话找出发生了什么变化

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);
}
public AuthenticationResult Authenticate(字符串用户名、字符串密码)
{
if(loggedInUsers.ContainsKey(用户名))
返回AuthenticationResult.AlreadyLoggedIn;
使用(var session=OpenSession())
{
var member=session.Query();
}
if(成员==null)
返回AuthenticationResult.NoUser;
if(member.Password!=密码)
返回AuthenticationResult.ErrorPassword;
添加(用户名,新LoggedInMember(DateTime.Now,member));
var dto=mapper.Map(成员);
返回新的AuthenticationResult(dto);
}
公共作废更新(ICollection DTO)
{
使用(var session=OpenSession())
{
foreach(dto中的var dto)
{
更新(会话,dto);
}
session.Flush();
}
}
无效更新(ISession会话,MemberDto到dto)
{
Loggedin成员liMember;
if(!loggedInUsers.TryGetValue(dto.Name,out liMember)
抛出新的AuthException(“未登录”)
session.Lock(li.Member,LockMode.None);//附加
mapper.Map(li.Member,dto);
}

您在何处/何时创建登录成员实例?这些实例是在用户登录时创建的,在用户注销时删除。至于“何处”,我不确定您的意思…(对不起)还有其他建议吗?我想让图表尽可能完整。对建议的解决方案有什么意见吗?谢谢你的回答,尽管我不太明白。假设我有一个WCF服务,名为AuthenticationService。客户端调用方法“Authentication”,提供用户名和密码。如果凭据与现有成员匹配,则会创建一个登录成员对象,该对象将引用该成员对象。只要服务器运行,我就只需要该登录成员对象,我不需要将其保留在数据库中,是吗?是否有办法完成类似操作?确定并记录dInUsers将被声明在何处?如何使其可用于服务的所有调用(来自其他客户端),甚至来自需要访问登录用户的其他服务?(当前我的服务都有InstanceContextMode=PerSession)。我想我可以使其静态,但这是“好”吗要做什么?我使用了一个单独的登录用户服务注入到构造函数中,该构造函数在容器中注册为实例/容器生命周期