gpt4 book ai didi

c# - NHibernate Envers : Cannot insert duplicate key in object

转载 作者:太空狗 更新时间:2023-10-29 21:39:23 27 4
gpt4 key购买 nike

我正在使用 Envers 来审计表,但它正在为未知/不存在的表创建一些审计表。它看起来像是多对一关系的多对多关系审计表。

这样对吗?如果是,为什么?

dbo.HorarioFixo - OK
dbo.HorarioFixo_Auditoria - OK
dbo.HorarioFixo_JanelaHorarioFixo_Auditoria - NOK
dbo.JanelaHorarioFixo - OK
dbo.JanelaHorarioFixo_Auditoria - OK

但是当我尝试删除/删除和 HorarioFixo 时出现错误。

我得到的错误:

NHibernate.Exceptions.GenericADOException
could not execute batch command.[SQL: SQL not available]
em NHibernate.Engine.ActionQueue.BeforeTransactionCompletionProcessQueue.BeforeTransactionCompletion()
em NHibernate.Impl.SessionImpl.BeforeTransactionCompletion(ITransaction tx)
em NHibernate.Transaction.AdoTransaction.Commit()
em Foo.Testes.Servicos.TesteCanalDeTransmissaoService.RemoveDependenciasCorretamente() na TesteCanalDeTransmissaoService.cs: line 195
System.Data.SqlClient.SqlException
Violation of PRIMARY KEY constraint 'PK__HorarioF__450088476960C81E'. Cannot insert duplicate key in object 'dbo.HorarioFixo_JanelaHorarioFixo_Auditoria'.
Violation of PRIMARY KEY constraint 'PK__HorarioF__450088476960C81E'. Cannot insert duplicate key in object 'dbo.HorarioFixo_JanelaHorarioFixo_Auditoria'.
The statement has been terminated.
The statement has been terminated.

这是复制的 SQL:

exec sp_executesql N'INSERT INTO HorarioFixo_JanelaHorarioFixo_Auditoria (REVTYPE, REV, HorarioFixoId, JanelaHorarioFixoId) VALUES (@p0, @p1, @p2, @p3)',N'@p0 tinyint,@p1 int,@p2 bigint,@p3 bigint',@p0=2,@p1=3,@p2=1,@p3=2 go

所有这些都是代码的一部分。如果您需要更多信息,请发表评论。

我的类(class):

public class Entidade
{
protected Entidade();

public virtual long Id { get; set; }
public virtual long Version { get; set; }

public abstract override bool Equals(object obj);
public override int GetHashCode();
}

public class Horario : Entidade
{
protected Horario()
{

}
}

public class HorarioFixo : Horario
{
public virtual int Frequencia { get; set; }

public virtual ICollection<JanelaHorarioFixo> JanelasRemessa { get; set; }

public virtual ICollection<JanelaHorarioFixo> JanelasRetorno { get; set; }
}

public class JanelaHorarioFixo : Entidade
{
public virtual TimeSpan HorarioInicio { get; set; }

public virtual TimeSpan? HorarioLimite { get; set; }
}

我的映射:

public class HorarioMap : ClassMapping<Horario>
{
public HorarioMap()
{
Id(x => x.Id, mapper =>
{
mapper.Generator(Generators.Identity);
mapper.UnsavedValue(0);
});
}
}

public class HorarioFixoMap : JoinedSubclassMapping<HorarioFixo>
{
public HorarioFixoMap()
{
Property(x => x.Frequencia);

Bag(x => x.JanelasRemessa, m =>
{
m.Cascade(Cascade.All);
m.Lazy(CollectionLazy.NoLazy);
}, map => map.OneToMany());

Bag(x => x.JanelasRetorno, m =>
{
m.Cascade(Cascade.All);
m.Lazy(CollectionLazy.NoLazy);
}, map => map.OneToMany());
}
}

public class JanelaHorarioFixoMap : ClassMapping<JanelaHorarioFixo>
{
public JanelaHorarioFixoMap()
{
Id(x => x.Id, mapper =>
{
mapper.Generator(Generators.Identity);
mapper.UnsavedValue(0);
});

Property(x => x.HorarioInicio, m => m.NotNullable(true));

Property(x => x.HorarioLimite, m => m.NotNullable(false));
}
}

NH 和 Envers 配置:

var ormHelper = ORMHelperUtils.GetORMHelper();

var mapper = new MyConventionModelMapper();

_config = new Configuration();

mapper.AddMappings(ormHelper.GetMappings());
mapper.AddMapping(typeof(REVINFOMap));
ormHelper.SetupApplicationNeeds(_config);

_config.AddMapping(mapper.CompileMappingForAllExplicitlyAddedEntities());
_config.SetProperty(Environment.CurrentSessionContextClass, "call");

if (ormHelper.UseEnvers)
{
var classesDominio = ormHelper.GetDomainTables();

if (classesDominio.Any())
{
var envers = new FluentConfiguration();
envers.Audit(classesDominio);

envers.SetRevisionEntity<REVINFO>(e => e.Id, e => e.Date, new CustomRevisionListener());

_config.SetEnversProperty(ConfigurationKey.AuditTableSuffix, "_Auditoria");
_config.IntegrateWithEnvers(envers);
}
}

最佳答案

我刚把我的类(class)改成了

public class HorarioFixo : Horario
{
public virtual int Frequencia { get; set; }

public virtual ICollection<JanelaHorarioFixo> Janelas { get; set; }
}

并为 JanelaHorarioFixo 添加了一个属性来标识类型。但是表 dbo.HorarioFixo_JanelaHorarioFixo_Auditoria 还在,我不知道为什么。

关于c# - NHibernate Envers : Cannot insert duplicate key in object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22661873/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com