【发布时间】:2016-07-07 02:38:36
【问题描述】:
我无法理解更新数据的正确映射(按代码映射)。在这里(为了清楚起见进行了简化)。
- [Persons] 表只是一个字典并且是不可变的。
- [对象] 可以是:
- 已创建,
- 用 [persons] 修改:
- 添加到对象或
- 从对象中删除或
- 仅修改元数据(状态和日期)。
我不知道如何正确映射我的课程。无论我设置什么样的级联,我都无法进入休眠状态: - 不修改人员记录, - 从 objectperson 表中正确删除或修改记录 - 它主要只是尝试添加新记录。我怀疑我的映射完全错误,但无法弄清楚。
我还尝试为 objectperson 表创建复合键(更有意义),但发现由于某种原因在 nhibernate 中不鼓励这样做。这就是我添加单独的 autoid 列的原因。
我设法使选择记录工作(示例如下),但 SaveOrUpdate 从未按预期工作......我哪里出错了?
我的课:
t_object
{
public virtual int ID { get; set; }
public virtual string Number { get; set; }
public virtual IEnumerable<t_objectperson> Persons { get; set; }
}
t_person
{
public virtual int ID { get; set; }
public virtual string Name { get; set; }
public virtual string Surename { get; set; }
public virtual IEnumerable<t_objectperson> Objects { get; set; }
}
t_objectperson
{
public virtual int ID { get; set; }
public virtual t_object Object { get; set; }
public virtual t_person Person { get; set; }
public virtual int Status { get; set; }
public virtual DateTime Added { get; set; }
public virtual DateTime? Expired { get; set; }
}
我的映射:
public t_object_map()
{
this.Table("rs_object");
this.Id(c => c.ID, m =>
{
m.Column("Id");
m.Generator(Generators.Identity);
});
this.Property(c => c.Number);
Set(x => x.Persons
, c => {
c.Key(k => k.Column("IdObject"));
c.Cascade(Cascade.All);
}
, map => map.OneToMany(p => p.Class(typeof(t_objectperson)))
);
}
public t_objectperson_map()
{
this.Table("rs_objectperson");
this.Id(c => c.ID, m =>
{
m.Column("Id");
m.Generator(Generators.Identity);
});
this.Property(c => c.ID);
this.ManyToOne(p => p.Object, m =>
{
m.Column("IdObject");
m.Cascade(Cascade.All);
//m.NotNullable(true);
m.Unique(false);
});
this.ManyToOne(p => p.Person, m =>
{
m.Column("IdPerson");
//m.Cascade(Cascade.All);
//m.NotNullable(true);
m.Unique(false);
});
}
public t_person_map()
{
this.Table("rs_person");
this.Id(c => c.ID, m =>
{
m.Column("Id");
m.Generator(Generators.Identity);
});
this.Property(c => c.Name);
this.Property(c => c.Surename);
}
我如何获取数据:
var query = session
.QueryOver<t_object>()
.Where(c => c.ID == ID)
.Fetch(c => c.Persons).Eager
.Fetch(x => x.Persons.First().Object).Eager
.OrderBy(c => c.Number).Asc
.List<t_object>();
【问题讨论】:
标签: c# nhibernate nhibernate-mapping-by-code