NHibernate SaveOrUpdateCopy不会插入具有CompositeId的实体
我有一个具有CompositeId的实体,它不会使用SaveOrUpdateCopy向数据库插入新行。NHibernate生成的INSERT语句填充了?对于每个字段的值。它使用SaveOrUpdate插入fine,使用SaveOrUpdateCopy或SaveOrUpdate更新fine,没有CompositeId的任何实体使用SaveOrUpdateCopy插入/更新fine。我不想创建一个if/then来查找具有CompositeId的实体,以决定是否应该使用SaveOrUpdate或SaveOrUpdateCopy。让SaveOrUpdateCopy使用CompositeId的实体有什么诀窍吗 以下是为保护无辜而更改的代号: public class MyEntity { public virtual Int32 FirstProperty { get; set; } public virtual string SecondProperty { get; set; } public virtual string DataText { get; set; } public override int GetHashCode( ) { int hashCode = 0; hashCode = hashCode ^ FirstProperty.GetHashCode() ^ SecondProperty.GetHashCode(); return hashCode; } public override bool Equals( object obj ) { MyEntity toCompare = obj as MyEntity; if( toCompare == null ) { return false; } return ( GetHashCode() != toCompare.GetHashCode() ); } } 数据库调用: public MyEntity GetMyEntity(long firstProperty, string secondProperty) { using (var session = sessionFactory.OpenSession()) { var result = from entity in session.Linq() where entity.FirstProperty == firstProperty && entity.SecondProperty== secondProperty select entity; return result.Count() > 0 ? result.First() : null; } } 数据库保存:NHibernate SaveOrUpdateCopy不会插入具有CompositeId的实体,nhibernate,fluent-nhibernate,Nhibernate,Fluent Nhibernate,我有一个具有CompositeId的实体,它不会使用SaveOrUpdateCopy向数据库插入新行。NHibernate生成的INSERT语句填充了?对于每个字段的值。它使用SaveOrUpdate插入fine,使用SaveOrUpdateCopy或SaveOrUpdate更新fine,没有CompositeId的任何实体使用SaveOrUpdateCopy插入/更新fine。我不想创建一个if/then来查找具有CompositeId的实体,以决定是否应该使用SaveOrUpdate或Sav
向复合键类添加一个version属性,请参阅以获取详细说明。我将compositeId与FluentnHibernate一起使用,但我对Equals和GetHashCode的实现不同。这个类有7个字段作为键:
public class PresupuestoGastoPromocion
{
public PresupuestoGastoPromocion() { }
public virtual int Año { get; set; }
public virtual int Mes { get; set; }
public virtual int PartidaId { get; set; }
public virtual string Equipo { get; set; }
public virtual string CodFamilia { get; set; }
public virtual string GDP { get; set; }
public virtual int TipoPresupuestoId { get; set; }
public virtual float Monto { get; set; }
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as PresupuestoGastoPromocion;
if (t == null)
return false;
if (CodFamilia == t.CodFamilia && Año == t.Año && Mes == t.Mes && TipoPresupuestoId == t.TipoPresupuestoId && Equipo == t.Equipo && PartidaId == t.PartidaId && GDP == t.GDP)
return true;
return false;
}
public override int GetHashCode()
{
return (CodFamilia + "|" + Año + "|" + Mes + "|" + TipoPresupuestoId + "|" + Equipo + "|" + PartidaId + "|" + GDP).GetHashCode();
}
}
public class PresupuestoGastoPromocionMap : ClassMap<PresupuestoGastoPromocion>
{
public PresupuestoGastoPromocionMap()
{
Table("PresupuestoGastoPromocion");
CompositeId()
.KeyProperty(x => x.Año)
.KeyProperty(x => x.Mes)
.KeyProperty(x => x.TipoPresupuestoId)
.KeyProperty(x => x.CodFamilia, "Cod_Familia")
.KeyProperty(x => x.Equipo)
.KeyProperty(x => x.GDP)
.KeyProperty(x => x.PartidaId);
Map(x => x.Monto).Column("Monto");
}
}
我希望这将对您有所帮助。我正在研究您建议的链接中建议的解决方案,但在nhibernate xml模式中,不允许使用version元素。。我做错什么了?谢谢 using (var session = sessionFactory.OpenSession()) { using (var transaction = session.BeginTransaction()) { try { session.SaveOrUpdateCopy(entity); transaction.Commit(); } catch(Exception ex) { transaction.Rollback(); throw; } } }
public class PresupuestoGastoPromocion
{
public PresupuestoGastoPromocion() { }
public virtual int Año { get; set; }
public virtual int Mes { get; set; }
public virtual int PartidaId { get; set; }
public virtual string Equipo { get; set; }
public virtual string CodFamilia { get; set; }
public virtual string GDP { get; set; }
public virtual int TipoPresupuestoId { get; set; }
public virtual float Monto { get; set; }
public override bool Equals(object obj)
{
if (obj == null)
return false;
var t = obj as PresupuestoGastoPromocion;
if (t == null)
return false;
if (CodFamilia == t.CodFamilia && Año == t.Año && Mes == t.Mes && TipoPresupuestoId == t.TipoPresupuestoId && Equipo == t.Equipo && PartidaId == t.PartidaId && GDP == t.GDP)
return true;
return false;
}
public override int GetHashCode()
{
return (CodFamilia + "|" + Año + "|" + Mes + "|" + TipoPresupuestoId + "|" + Equipo + "|" + PartidaId + "|" + GDP).GetHashCode();
}
}
public class PresupuestoGastoPromocionMap : ClassMap<PresupuestoGastoPromocion>
{
public PresupuestoGastoPromocionMap()
{
Table("PresupuestoGastoPromocion");
CompositeId()
.KeyProperty(x => x.Año)
.KeyProperty(x => x.Mes)
.KeyProperty(x => x.TipoPresupuestoId)
.KeyProperty(x => x.CodFamilia, "Cod_Familia")
.KeyProperty(x => x.Equipo)
.KeyProperty(x => x.GDP)
.KeyProperty(x => x.PartidaId);
Map(x => x.Monto).Column("Monto");
}
}