C# 将“已分配”ID与NHibernate一起使用

C# 将“已分配”ID与NHibernate一起使用,c#,nhibernate,transient,C#,Nhibernate,Transient,在多对一的关系中,我有两个实体,工作和语言。这些实体的映射配置如下所示: public class JobMap : ClassMap<Job> { public JobMap() { Table("\"JOB\""); LazyLoad(); Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_job", "50"); Ma

在多对一的关系中,我有两个实体,工作和语言。这些实体的映射配置如下所示:

public class JobMap : ClassMap<Job>
{
    public JobMap()
    {
        Table("\"JOB\"");
        LazyLoad();            
        Id(x => x.Id, "id").GeneratedBy.HiLo("hilo", "hilo_job", "50");
        Map(x => x.Name).Column("name").Unique();
        References<Language>(x => x.SourceLanguage, "fk_id_language").Cascade.None();
    }
}

public class LanguageMap : ClassMap<Language>
{
    public LanguageMap()
    {
        Table("\"LANGUAGE\"");
        LazyLoad();                        
        Id(x => x.Id, "id").GeneratedBy.Assigned().UnsavedValue(0);            
        Map(x => x.Code).Column("code");
    }
}
JobRepository.AddJob作业很简单

public void Add(Job entity)
{
    SessionBuilder.GetSession().Save(entity);
}
问题在于,在启用NHProfiler的情况下运行此代码时,在插入作业表之前,我可以看到以下警告:

警告: 无法确定具有指定标识符47的en GB是暂时的还是分离的;查询数据库。在会话中使用显式保存或更新可防止出现这种情况

然后从语言表中选择以加载id为47的语言实体,其中en GB是Job.SourceLanguage对象的代码

在我的例子中,我不想从数据库中更新、插入或删除一个语言实体,如果它只是从其他实体引用的,那么它实际上是不可变的,总是用正确的行填充。有没有一种方法可以告诉NHibernate从我这里获取语言,在插入作业表时,使用它的Id属性,而不关心它是否存在于数据库中

在将作业添加到存储库之前添加此行时

job.SourceLanguage = session.Load<Language>(sourceLanguage.Id);
我不再得到警告或选择,但无论我在哪里使用语言实体都要这样做有点麻烦


非常感谢。

一个选项是使用拦截器类!重写OnSave方法添加此

job.SourceLanguage = session.Load<Language>(sourceLanguage.Id);
当实体是作业时。通过这种方式,您不必在任何地方都执行此查询

请看下面的例子:


非常感谢你!这看起来是一个优雅的解决方案。
job.SourceLanguage = session.Load<Language>(sourceLanguage.Id);