使用NHibernate时的WCF方法:如何在不首先查询的情况下更新记录

时间:2014-04-07 18:19:57

标签: c# wcf nhibernate

我是NHibernate和WCF的新手,并尝试围绕一些概念,即如何更新记录而不必先加载/查询。

我已经编写了两个供GUI客户端使用的WCF方法。

一些预先确定的信息:

public class Users  // Corresponding to SQL table Users
{
    public virtual int UserId { get; set; }     // internal autogenerated ID
    public virtual string UserName { get; set; }
}

public class UserWorklistPreference // Corresponding to SQL table UserWorklistPreference    
{
    public virtual int UserWorklistPreferenceID { get; set; } // internal autogenerated ID
    public virtual int AutoRefreshPeriod { get; set; }
    public virtual Users UserOfPreference { get; set; } // "foreign key" via Users entity class 

}


public class UsersMap : ClassMap<Users>
{
    public UsersMap()
    {
        Id(x => x.UserId);
        Map(x => x.UserName);
    }
}

public class UserWorklistPreferenceMap : ClassMap<UserWorklistPreference>
{
    public UserWorklistPreferenceMap()
    {
        Id(x => x.UserWorklistPreferenceID);
        Map(x => x.AutoRefreshPeriod);
        References(x => x.UserOfPreference)
            .Column("UserId")
            .Cascade.All();     // Not sure if Cascade is needed in my situation.
    }
}

SQL Server Table Users:
 UsersId
 UserName

SQL Server Table UserWorklistPreference:
 UserWorklistPreferenceID 
 AutoRefreshPeriod 
 UserID (FK)

GUI通过拨打以下内容显示登录用户的自动刷新设置:

public SomeDataTransferObj GetUserWorkspacePreferences(int iD)//其中iD是登录用户的内部标识符。

public SomeDataTransferObj GetUserWorkspacePreferences(int iD)
{
// method basically does this (ignoring session factory/session/transaction/wcf context logic for now):

    var result =
        (from prefs in Session.Query<UserWorklistPreference>()
        where prefs.UserOfPreference.UserId == iD
        select prefs).SingleOrDefault();


    return new SomeDataTransferObj
            {
                UserId = result.UserOfPreference.UserId,
                UserName = result.UserOfPreference.UserName,
                AutoRefreshPeriod = result.AutoRefreshPeriod
            };
}

GUI显示用户的自动刷新值。从调用中真正需要的所有GUI都是一个值AutoRefreshPeriod,我不希望它跟踪SomeDataTransferObj对象中返回的任何其他内容。

稍后,用户可以设置/更改autorefresh值,然后通过填充新的SomeDataTransferObj对象作为参数,通过第二种方法保存它。

因为我已经说得很流利了:

.CurrentSessionContext(&#34; wcf_operation&#34)

我假设会话是按方法调用的。这意味着对于UserWorklistPreference记录/表,再次从头开始调用set方法????这是我不知道如何继续的地方。

我目前有类似以下内容(不是完整的代码),其中SomeDataTransferObj类型的参数userPrefs具有由调用GUI客户端设置的UserId和AutoRefresh属性:

    public int SetUserPreferences(SomeDataTransferObj userPrefs)
    {
        int retVal = 1;

       // method basically does this (ignoring session factory/session/transaction/wcf context logic for now):

        Users user = new Users();   // Entity class.
        user.UserId = userPrefs.UserId;

        UserWorklistPreference workListPrefs = new UserWorklistPreference();    // Entity class.
        workListPrefs.AutoRefreshPeriod = userPrefs.AutoRefreshPeriod;
        workListPrefs.UserOfPreference = user;

        Session.Update(workListPrefs);  // Or try SaveOrUpdate()???

        return retVal;
    }

问题是当Session.SaveOrUpdate()调用尝试插入用户时(当然,因为我们只是尝试更新现有用户)时Session.Update()不执行任何操作。首选项)。

当我只有UserId和autorefresh值时,如何实现以下SQL行为?

UPDATE UserWorklistPreference SET AutoRefreshPeriod = userPrefs.AutoRefreshPeriod WHERE UserID = userPrefs.UserId

我可以先通过用户ID在SetUserPreferences()中查询以获取UserWorklistPreference记录,使用数据传输对象中的信息更新该实体,然后使用Session.Update(),但不会效率低下?

任何建议/帮助表示赞赏!感谢。

-Gav

1 个答案:

答案 0 :(得分:0)

简单地说:你不是。使用ORM的关键在于使您使用对象实例,但任何更改都会自动保存到数据库。当然可能存在某种类型的hack,它可以完全满足您的需求,或者您可以完全绕过ORM并使用原始SQL,但后来我没有注意到使用ORM框架。

相关问题