我如何告诉NHibernate只保存更改的属性

gag*_*abu 6 .net c# nhibernate detach

我有类使用NHibernate映射到数据库的Person.我从DB加载对象并将其发送到不同的客户端.第一个客户端将修改Name和Country属性.第二个客户端将仅修改Name属性.然后两者都将修改后的对象返回给服 当我从第一个客户端保存数据时 - 然后保存正确,两者 - 名称和国家/地区更新.当我从第二个客户端保存数据时 - 我有问题.它是来自第一个客户端的覆盖数据并保存新名称和国家/地区的初始值.

我如何告诉NHibernate只保存Name值而不是覆盖Country值?

public class Person
{
    public string Name { get; set; }
    public string Country { get; set; }
}

public static List<Person> GetEntities()
{
    var factory = CreateSessionFactory();
    using (ISession session = factory.OpenSession())
    {
        return session.CreateCriteria<Person>().List<Person>();                
    }
}

public static void SaveEntities(List<Person> entities)
{
    var factory = CreateSessionFactory();
    using (ISession session = factory.OpenSession())
    {
         using (var t = session.BeginTransaction())
         {
             foreach (var person in entities)
             {
                 session.Merge(person);
             }

             t.Commit();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

PS:抱歉我的英文不好

reb*_*ard 15

实际上,您可以告诉NHibernate使用具体更新"脏"字段Dynamic Update.

更多信息:http://ayende.com/blog/3946/nhibernate-mapping-concurrency


Ste*_*ger 1

答案是:你不能。NH不知道只是名字变了。

您可以通过不允许并发编辑来避免这种情况。比如通过NH的乐观锁机制。第二个客户将得到StaleObjectStateException.

如果两个客户端的编辑实际上不同时(但都基于相同的对象状态),则需要确保第二个客户端在编辑之前获取第一个客户端的更改。例如,通过在打开编辑器之前检索实际状态或从服务器发送更改通知。

如果你想保持并发编辑,你还有很多工作要做。客户需要提供实际发生变化的信息。然后您只需复制这些值。这是一项艰苦的工作。那么您可能仍然会遇到这样合并的值不适合的问题。