NHibernate SaveOrUpdateCopy不会插入具有CompositeId的实体

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

我有一个具有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; } } 数据库保存:


向复合键类添加一个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");


    }
}