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