NHibernate在添加新子行时更新所有子行

NHibernate在添加新子行时更新所有子行,nhibernate,nhibernate-mapping,Nhibernate,Nhibernate Mapping,我正在努力解决一个与父子映射相关的问题。 我认为我做的每件事都是正确的,但是每次我添加一个子项并保存父项时,nhibernate都会执行一个insert,然后更新子项列表中的所有行。 这是我的类和映射 public class Cliente : EntityBase { public virtual string Cognome { get; set; } public virtual string Nome { get; set; } public virtu

我正在努力解决一个与父子映射相关的问题。 我认为我做的每件事都是正确的,但是每次我添加一个子项并保存父项时,nhibernate都会执行一个insert,然后更新子项列表中的所有行。 这是我的类和映射

  public class Cliente : EntityBase
  {
    public virtual string Cognome { get; set; }
    public virtual string Nome { get; set; }
    public virtual int AttivitaId { get; set; }
    public virtual DateTime? DittaAssunzioneData { get; set; }
    public virtual decimal Stipendio { get; set; }

    public virtual IList<ClienteChiusura> Chiusure { get; protected set; }

    public virtual void AddTelefonata(Telefonata telefonata)
    {
      if (Telefonate == null)
        Telefonate = new List<Telefonata>();
      //NHibernate impedence
      telefonata.Cliente = this;
      Telefonate.Add(telefonata);
    }

    public virtual void RemoveTelefonata(int telefonataId)
    {
      if (Telefonate == null)
        return;
      var telefonata = Telefonate.SingleOrDefault(x => x.Id == telefonataId);
      if (telefonata != null)
      {
        Telefonate.Remove(telefonata);
        telefonata.Cliente = null;
      }
    }
  }

  public class Telefonata : EntityBase
  {
    public virtual Cliente Cliente { get; set; }
    public virtual string Descrizione { get; set; }
    public virtual DateTime? Data { get; set; }
    public virtual bool Ingresso { get; set; }
    public virtual string Utente { get; set; }
    public virtual DateTime? UtenteData { get; set; }
    public virtual TelefonataTipo TelefonataTipo { get; set; }
  } 

  public class TelefonataTipo : EntityBase
  {
    public virtual string Nome { get; set; }
  }


  public abstract class EntityBase
  {
   public virtual int Id { get; private set; }

   //ctor
   protected EntityBase()
   { }

   public override int GetHashCode()
   {
     return Id.GetHashCode();
   }

   public override bool Equals(object obj)
   {
     return (obj != null && obj.GetType() == GetType() && ((EntityBase)obj).Id == Id);
   }

   public static bool operator ==(EntityBase entity1, EntityBase entity2)
   {
     //cast come object altrimenti ho un loop ricorsivo
     if ((object)entity1 == null && (object)entity2 == null)
       return true;

     if ((object)entity1 == null || (object)entity2 == null)
       return false;

     if (entity1.GetType() != entity2.GetType())
       return false;

     if (entity1.Id != entity2.Id)
       return false;

     return true;
   }

   public static bool operator !=(EntityBase entity1, EntityBase entity2)
   {
     return (!(entity1 == entity2));
   }
}
公共类客户机:EntityBase
{
公共虚拟字符串Cognome{get;set;}
公共虚拟字符串Nome{get;set;}
公共虚拟int-AttivitaId{get;set;}
公共虚拟日期时间?DittaAssunzioneData{get;set;}
公共虚拟十进制津贴{get;set;}
公共虚拟IList Chiusure{get;protected set;}
公共虚拟空间地址Telefonata(Telefonata Telefonata)
{
if(Telefonate==null)
Telefonate=新列表();
//NHibernate阻抗
telefonata.Cliente=此;
telefontate.Add(telefonta);
}
公共虚拟无效删除Telefonata(int telefonataId)
{
if(Telefonate==null)
返回;
var telefonata=Telefonate.SingleOrDefault(x=>x.Id==telefonataId);
if(telefonata!=null)
{
Telefontate.移除(Telefonta);
telefonata.Cliente=null;
}
}
}
公共类Telefonata:EntityBase
{
公共虚拟客户端客户端{get;set;}
公共虚拟字符串描述符{get;set;}
公共虚拟日期时间?数据{get;set;}
公共虚拟布尔{get;set;}
公共虚拟字符串utinte{get;set;}
公共虚拟日期时间?Utenedata{get;set;}
公共虚拟TelefonataTipo TelefonataTipo{get;set;}
} 
公共类Telefonattipo:EntityBase
{
公共虚拟字符串Nome{get;set;}
}
公共抽象类EntityBase
{
公共虚拟整数Id{get;private set;}
//执行器
受保护的EntityBase()
{ }
公共覆盖int GetHashCode()
{
返回Id.GetHashCode();
}
公共覆盖布尔等于(对象对象对象)
{
返回(obj!=null&&obj.GetType()==GetType()&&&((EntityBase)obj.Id==Id);
}
公共静态布尔运算符==(EntityBase entity1、EntityBase entity2)
{
//在ricorsivo环上施放目标altrimenti ho un loop
如果((对象)entity1==null&&(对象)entity2==null)
返回true;
如果((对象)entity1==null | |(对象)entity2==null)
返回false;
if(entity1.GetType()!=entity2.GetType())
返回false;
if(entity1.Id!=entity2.Id)
返回false;
返回true;
}
公共静态布尔运算符!=(EntityBase entity1、EntityBase entity2)
{
返回(!(entity1==entity2));
}
}
其映射如下所示

public class ClienteMapping : MappingBase<Evoltel.PuntoQuinto.Domain.Entities.Cliente.Cliente>
  {
    public ClienteMapping()
      : base("CLIENTI")
    {
      Id(x => x.Id, c => { c.Column("CLIENTE_ID"); c.Generator(Generators.Native, g => g.Params(new { sequence = "GEN_CLIENTI_ID" })); });
      Property(x => x.Cognome, c => c.Column("COGNOME"));
      Property(x => x.Nome, c => c.Column("NOME"));
      Property(x => x.AttivitaId, c => c.Column("ATTIVITA_ID"));
      Property(x => x.DittaAssunzioneData, c => c.Column("D_ASSUNZIONE_DATA"));
      Property(x => x.Stipendio, c => c.Column("D_STIPENDIO"));

      Bag(x => x.Telefonate, map =>
      {
        map.Inverse(true);
        map.Table("TELEFONATE");
        map.Cascade(Cascade.All | Cascade.DeleteOrphans);
        map.Key(k => k.Column("CLIENTE_ID"));
        map.Lazy(CollectionLazy.NoLazy);
      }, r => r.OneToMany());
  }

public class TelefonataMapping : MappingBase<Evoltel.PuntoQuinto.Domain.Entities.Cliente.Telefonata>
{
  public TelefonataMapping()
    : base("TELEFONATE")
  {
    Id(x => x.Id, c => { c.Column("TELEFONATA_ID"); c.Generator(Generators.Native, g => g.Params(new { sequence = "GEN_TELEFONATE_ID" })); });
    ManyToOne(x => x.Cliente, c => c.Column("CLIENTE_ID"));
    Property(x => x.Descrizione, c => c.Column("DESC_LUNGA"));
    Property(x => x.Data, c => c.Column("TELEFONATA_DATA"));
    Property(x => x.Ingresso, c => { c.Column("INGRESSO"); c.Type<TrueFalseType>(); });
    Property(x => x.Utente, c => c.Column("UTENTE_NOME"));
    Property(x => x.UtenteData, c => c.Column("UTENTE_DATA"));
    ManyToOne(x => x.TelefonataTipo, c => { c.Column("TELEFONATA_TIPO_ID"); c.NotFound(NotFoundMode.Ignore); });
  }
}

public abstract class MappingBase<T> : ClassMapping<T> where T : EntityBase
 {
   protected MappingBase(string tableName)
   {
     Table(tableName);
     Lazy(false);
     DynamicUpdate(true);
   }
 }
public类ClienteMapping:MappingBase
{
公共客户映射()
:base(“CLIENTI”)
{
Id(x=>x.Id,c=>{c.Column(“CLIENTE_Id”);c.Generator(Generators.Native,g=>g.Params(new{sequence=“GEN_CLIENTI_Id”);});
属性(x=>x.Cognome,c=>c.Column(“Cognome”);
属性(x=>x.Nome,c=>c.Column(“Nome”);
属性(x=>x.AttivitaId,c=>c.Column(“ATTIVITA_ID”);
属性(x=>x.DittaAssunzioneData,c=>c.Column(“D_ASSUNZIONE_数据”);
财产(x=>x.津贴,c=>c.列(“D_津贴”);
行李(x=>x.电传,地图=>
{
逆映射(真);
地图桌(“TELEFONATE”);
map.Cascade(Cascade.All | Cascade.delete孤儿);
map.Key(k=>k.Column(“客户ID”);
map.Lazy(CollectionLazy.NoLazy);
},r=>r.OneToMany());
}
公共类TelefonatMapping:MappingBase
{
公共电信地图()
:base(“TELEFONATE”)
{
Id(x=>x.Id,c=>{c.Column(“TELEFONATA_Id”);c.Generator(Generators.Native,g=>g.Params(new{sequence=“GEN_TELEFONATE_Id”);});
多克隆(x=>x.客户,c=>c.列(“客户ID”);
属性(x=>x.descripione,c=>c.Column(“DESC_LUNGA”);
属性(x=>x.Data,c=>c.Column(“TELEFONATA_数据”);
属性(x=>x.ingreso,c=>{c.Column(“ingreso”);c.Type();});
属性(x=>x.utete,c=>c.Column(“utete_NOME”);
属性(x=>x.utedata,c=>c.Column(“utete_数据”);
manytone(x=>x.telefonatipo,c=>{c.Column(“TELEFONATA_TIPO_ID”);c.NotFound(NotFoundMode.Ignore);});
}
}
公共抽象类映射库:类映射,其中T:EntityBase
{
受保护的MappingBase(字符串表名)
{
表(表名);
懒惰(假);
日期(真);
}
}
如果我不使用Cascade,所有新的子对象都不会被保存(就我对NHibernate的理解而言,这是正确的)

我没看到的是什么