2016-07-06 144 views
0

我有问题,理解正确的映射(通过代码映射)以更新我的数据。这里(为了清楚起见,简化了)。Nhibernate通过代码映射:多对多

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

我不能想通了如何正确映射我的班。无论我设置了哪种级联,我都无法获得nhibernate: - NOT修改人员记录, - 正确删除或修改objectperson表中的记录 - 它大多只是尝试添加新记录。我怀疑我的映射是完全错误的,但无法弄清楚。

我也尝试为objectperson表制作组合键(更有意义),但发现它出于某种原因在nhibernate中不鼓励。这就是为什么我添加了单独的自动列。

我设法使选择记录的工作(下面的示例),但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>(); 

回答

0

你失踪t_person_map集合映射?

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

这里时设置逆简单的解释:

一个一对多 - >多到一个

右侧应积极(左与逆=“真”),以保存在更新 (除非左侧明确订购)

即一方必须控制关系,并且您需要在执行此操作时保持一致。

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

+0

我会检查这个,但我想如果我选择或从对方使用它(我不)只需要逆。 – Robert