C# Fluent hHibernate一对多设置值为空
首先,很抱歉我的英语不好 我有以下实体C# Fluent hHibernate一对多设置值为空,c#,nhibernate,fluent-nhibernate,nancy,C#,Nhibernate,Fluent Nhibernate,Nancy,首先,很抱歉我的英语不好 我有以下实体 public class User { public virtual int Id { get; set; } public virtual Application Application { get; set; } public User () { Application = new Application (); } } 用户地图 public class UserMap : ClassM
public class User
{
public virtual int Id { get; set; }
public virtual Application Application { get; set; }
public User ()
{
Application = new Application ();
}
}
用户地图
public class UserMap : ClassMap<User>
{
public UserMap ()
{
Table ("Users");
Id (p => p.Id);
References (x => x.Application).Cascade.SaveUpdate ();
}
}
应用程序地图
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();
正确记录用户表中的数据,但保留为空,即ApplicationName表字段应用程序
public class Application
{
public virtual int Id { get; set; }
public virtual string ApplicationName { get; set; }
}
我认为错误在这一行user.Application.Id=Cast.To userModel.Application;
因为我没有设置ApplicationName字段
但是,如果我将id作为参数获取,我将需要按id获取应用程序对象,并分配用户对象?。
非常感谢您说得对,从ID转换为实体应用程序需要调用数据层及其操作GetById session.Loadid 在我们可以确定传递的应用程序ID存在的情况下,NHibernate有一种专门的方法来将ID转换为其实体。这是一种加载方法,它不会命中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);
层叠为新的。
以防我们收到全新的物品
{
"Application": { "ApplicaitonName" : ... }
}
我们可以创建一个,由于上面的级联设置,它也可以工作
user.Application = new Appliation
{
ApplicationName = ...,
}
对我知道;享受快乐
user.Application = new Appliation
{
ApplicationName = ...,
}