NHibernate在添加新子行时更新所有子行
我正在努力解决一个与父子映射相关的问题。 我认为我做的每件事都是正确的,但是每次我添加一个子项并保存父项时,nhibernate都会执行一个insert,然后更新子项列表中的所有行。 这是我的类和映射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
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的理解而言,这是正确的)
我没看到的是什么