【问题标题】:Nhibernate mapping by code: many to many通过代码进行休眠映射:多对多
【发布时间】:2016-07-07 02:38:36
【问题描述】:

我无法理解更新数据的正确映射(按代码映射)。在这里(为了清楚起见进行了简化)。

  • [Persons] 表只是一个字典并且是不可变的。
  • [对象] 可以是:
    • 已创建,
    • 用 [persons] 修改:
      1. 添加到对象或
      2. 从对象中删除或
      3. 仅修改元数据(状态和日期)。

我不知道如何正确映射我的课程。无论我设置什么样的级联,我都无法进入休眠状态: - 不修改人员记录, - 从 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


    【解决方案1】:

    您是否缺少 t_person_map 上的集合映射?

    你需要设置 Inverse(true) Set 集合。

    下面是关于何时设置反转的简要说明:

    一对多 -> 多对一

    右侧应处于活动状态(左侧为 inverse="true"),以保存更新 (除非左侧明确排序)

    即一方必须控制关系,您需要在执行此操作的方式上保持一致。

    来自:http://notherdev.blogspot.com/2012/04/nhibernates-inverse-what-does-it-really.html

    【讨论】:

    • 我会检查这个,但我认为只有在我从另一侧选择或使用它时才需要反向(我没有)。
    猜你喜欢
    • 1970-01-01
    • 2011-04-07
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2019-02-19
    • 1970-01-01
    • 2021-11-11
    相关资源
    最近更新 更多