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);