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获取应用程序对象,并分配用户对象。非常感谢

Fluent hHibernate一对多设置值为空

你是对的,从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 = ...,
}