Fluent hHibernate一对多设置值为空
本文关键字:设置 hHibernate 一对多 Fluent | 更新日期: 2023-09-27 18:09:54
首先,抱歉我的英语不好
我有以下实体
public class User
{
public virtual int Id { get; set; }
public virtual Application Application { get; set; }
public User ()
{
Application = new Application ();
}
}
UserMap
public class UserMap : ClassMap<User>
{
public UserMap ()
{
Table ("Users");
Id (p => p.Id);
References (x => x.Application).Cascade.SaveUpdate ();
}
}
应用程序public class Application
{
public virtual int Id { get; set; }
public virtual string ApplicationName { get; set; }
}
ApplicationMap
public ApplicationMap ()
{
Table ("Applications");
Id (x => x.Id);
Map (x => x.ApplicationName);
}
我收到了这个json
{
"Application": 1,
}
,然后保存
var user = new User();
user.Application.Id = Cast.To<int>(userModel.Application);
userService.Add(user);
userService.Commit();
正确记录了"users"表中的数据,但"ApplicationName"表字段"application"留空
我认为错误在这一行(user.Application)。Id = Cast。(userModel.Application);)因为我没有设置"ApplicationName"字段但如果我将id作为参数获取,则需要通过id获取应用程序对象,并分配用户对象。非常感谢
你是对的,从ID转换到实体(应用程序)将需要调用数据层及其操作GetById()
。
session.Load<Application>(id)
在这种情况下,我们可以确定,传递的应用程序ID存在,NHibernate有一个专门的方法如何将ID转换为它的实体。这是一个Load()
方法,它做NOT命中DB,只是创建一个代理提供ID,操作将成功:
var user = new User();
var applicationId = Cast.To<int>(userModel.Application);
// behind is session.Load<Aplication>(applicaitonId)
var application = applicationService.Load(applicationId);
user.Application = application;
userService.Add(user);
session.Get<Application>(id)
另一种方法是Get()
方法,它总是通过ID加载实例,即访问DB。如果ID与任何ID都不匹配,则返回null。这个场景的优点是,我们甚至可以更改引用的ApplicaitonName (如果应用程序存在)
var user = new User();
var applicationId = Cast.To<int>(userModel.Application);
// behind is session.Get<Aplication>(applicaitonId)
var application = applicationService.GetById(applicationId);
if(application !== null)
{
application.ApplicationName = ... // here we can even change that;
user.Application = application;
}
cascade for new.
以防我们收到全新的物品
{
"Application": { "ApplicaitonName" : ... }
}
我们可以创建一个,由于上面的层叠设置,它也会工作。
user.Application = new Appliation
{
ApplicationName = ...,
}