Finally, I made
*session.Auditer().CrossTypeRevisionChangesReader().FindEntities(3)
*work!
What I had to do is, instead of extending
*DefaultTrackingModifiedEntitiesRevisionEntity,
*I annotated the class and the necessary fields.
And I don't know if it is important but I reviewed Equals()' code and
copied the GetHashCode content from the
*DefaultTrackingModifiedEntitiesRevisionEntity
*implementation.
Like this:
ps: Unfortunately, the Listener isn't being called.
[RevisionEntity(typeof(RevInfoListener))]
public class CustomRevInfo
{
[RevisionNumber]
public virtual int Id { get; set; }
[RevisionTimestamp]
public virtual DateTime RevisionDate { get; set; }
public virtual string Usuario { get; set; }
[ModifiedEntityNames]
public virtual Set<string> ModifiedEntityNames { get; protected
set; }
public override bool Equals(object obj)
{
if (this == obj)
return true;
var casted = obj as CustomRevInfo;
if (casted == null)
return false;
if (Id != casted.Id) return false;
if (RevisionDate != casted.RevisionDate) return false;
if (Usuario != casted.Usuario) return false;
if (!ModifiedEntityNames.Equals(casted.ModifiedEntityNames))
return false;
return true;
}
public override int GetHashCode()
{
var result = Id;
result = 31 * result + (int)(((ulong)RevisionDate.Ticks) ^
(((ulong)RevisionDate.Ticks) >> 32));
return result;
}
}
Oh, btw, the docs says that the attribute's name is *ModifiedEntityTypes *when
in fact it is *ModifiedEntityNames.*
On Wednesday, February 19, 2014 4:06:40 PM UTC-3, Guilherme Paschoal wrote:
>
> Just to keep the update on my progress coming:
>
> I found out that the "query did not return unique result" exception is
> thrown by the criteria API's "query.UniqueResult" executed in
> FindEntityTypes method.
>
> I debugged it and changed it for "query.List()" and it executed the query
> yet it returned something like this:
>
> [0] {NHibernate.Envers.DefaultTrackingModifiedEntitiesRevisionEntity} object
> {DefaultTrackingModifiedEntitiesRevisionEntityProxy}
> [1] {NHibernate.Envers.DefaultTrackingModifiedEntitiesRevisionEntity} object
> {DefaultTrackingModifiedEntitiesRevisionEntityProxy}
> [2] {MyNamespace.DataAccess.Audit.REVINFO} object
> {MyNamespace.DataAccess.Audit.REVINFO}
>
>
> the two first rows in the result, seem to be related to the fact that 2
> entities are modified on the revision.
>
> I'll keep looking into it.
>
> On Wednesday, February 19, 2014 6:00:18 AM UTC-3, Roger wrote:
>>
>> Can’t see anything wrong on what you’ve posted. If you don’t have the
>> time to isolate your problem a bit more, I don’t know I’m afraid. Sorry.
>>
>>
>>
>> You might want to take a look at Envers’ tests and see what differs to
>> try to find out why they work but you have problems in your environment.
>>
>>
>>
>> If you do find the time to isolate your problem and it turns out it’s
>> really a bug in Envers, please report it to the JIRA.
>>
>>
>>
>> Good luck!
>>
>> /Roger
>>
>>
>>
>> *From:* [email protected] [mailto:[email protected]] *On
>> Behalf Of *Guilherme Paschoal
>> *Sent:* den 18 februari 2014 18:38
>> *To:* [email protected]
>> *Subject:* Re: [nhusers] [Envers] Query from different catalog
>>
>>
>>
>> Roger,
>>
>>
>>
>> Actually, I have to say I'm sorry first, I was only testing
>> GetCurrentRevision... Other querys "work".
>>
>>
>>
>> - *session.Auditer().GetCurrentRevision(false)* returns Id = 0 and
>> date = now;
>> -
>> *session.Auditer().CrossTypeRevisionChangesReader().FindEntities(3,RevisionType.Modified)
>>
>> *returns "query did not return a unique result: 3". Actually there
>> are 2 records for revision 3 in RevChanges table. How should I execute
>> this
>> query? I'm doing it like it is said in the docs.
>> - *session.Auditer().GetRevisionNumberForDate(new DateTime(2014, 02,
>> 17,15,55,03,503,DateTimeKind.Local)) *returns "query did not return a
>> unique result: 2". There's only one record in Revinfo for this exact
>> datetime.
>> - *session.Auditer().GetRevisions(typeof (ItemDeConfiguracao), 1)
>> *returns
>> 6 records (it looks like its something with it's query's inner/left join):
>>
>>
>> - Name - Value
>> - [0] - 1
>> - [1] - 3
>> - [2] - 4
>> - [3] - 1
>> - [4] - 3
>> - [5] - 4
>>
>> This is my nhibernate session factory:
>>
>>
>>
>> public static ISessionFactory SessionFactory
>>
>> {
>>
>> get
>>
>> {
>>
>> try
>>
>> {
>>
>> if (_sessionFactory == null)
>>
>> {
>>
>> lock (SyncRoot)
>>
>> {
>>
>>
>>
>> _sessionFactory = Fluently.Configure()
>>
>>
>> .Database(MsSqlConfiguration.MsSql2008.Dialect<CustomMsSql2008Dialect>()
>>
>> //.ConnectionString(c =>
>> c.FromConnectionStringWithKey("DBSQL_AUDIT")).ShowSql())
>>
>> .ConnectionString(c =>
>> c.FromConnectionStringWithKey("DBSQL")).ShowSql())
>>
>> .Mappings(m =>
>> m.FluentMappings.AddFromAssemblyOf<NHibernateHelper>())
>>
>> .ExposeConfiguration(ConfigurarEnvers)
>>
>> //.ExposeConfiguration(c => new
>> SchemaExport(c).SetOutputFile(@"C:\Temp\scripteste.txt").Execute(true,
>> true, false))
>>
>> .BuildSessionFactory();
>>
>>
>>
>>
>>
>> }
>>
>> }
>>
>> return _sessionFactory;
>>
>> }
>>
>> catch (FluentConfigurationException ex)
>>
>> {
>>
>> // Log.Fatal(ex);
>>
>> throw new Exception("Não foi possível conectar-se ao
>> banco de dados. Favor entrar em contato com o administrador do sistema.",
>> ex);
>>
>> }
>>
>> }
>>
>> }
>>
>> private static void ConfigurarEnvers(Configuration cfg)
>>
>> {
>>
>> var enversConf = new
>> NHibernate.Envers.Configuration.Fluent.FluentConfiguration();
>>
>> var rev = new RevInfoListener();
>>
>>
>>
>>
>> enversConf.Audit(Dominio.Classes.Helper.ObterSubClassesDeEntidadeBase());
>>
>>
>> cfg.SetEnversProperty(ConfigurationKey.TrackEntitiesChangedInRevision,
>> true);
>>
>> cfg.SetEnversProperty(ConfigurationKey.DefaultSchema, "dbo");
>>
>> cfg.SetEnversProperty(ConfigurationKey.DefaultCatalog,
>> "DB_AUDIT");
>>
>> cfg.IntegrateWithEnvers(enversConf);
>>
>>
>>
>> }
>>
>>
>> And this is my Custom REVINFO class
>>
>>
>>
>> [RevisionEntity(typeof(RevInfoListener))]
>>
>> public class REVINFO : DefaultTrackingModifiedEntitiesRevisionEntity
>>
>> {
>>
>> public virtual string Usuario { get; set; }
>>
>> }
>>
>>
>>
>> RevInfoListener
>>
>> public class RevInfoListener : IRevisionListener
>>
>> {
>>
>> public void NewRevision(object revisionEntity)
>>
>> {
>>
>> var usuario = Thread.CurrentPrincipal.Identity.Name;
>>
>>
>>
>> ((REVINFO)revisionEntity).Usuario = usuario;
>>
>> }
>>
>> }
>>
>>
>>
>> And REVINFOMap. The value returned by
>> configurationmanager.appsettings["BandoDeDadosAuditoria"] is
>> "DB_AUDIT.dbo". It's the catalog and schema name. It's the way I found to
>> force it uses the Audit database for querying, otherwise it will try to
>> query from the Session's catalog.
>>
>>
>>
>> public class REVINFOMap : ClassMap<REVINFO>
>>
>> {
>>
>> public REVINFOMap()
>>
>> {
>>
>>
>>
>> var bdAudit =
>> ConfigurationManager.AppSettings["BancoDeDadosAuditoria"];
>>
>> Schema(bdAudit);
>>
>> Table("REVINFO");
>>
>>
>>
>> Id(x => x.Id, "REV").GeneratedBy.Identity();
>>
>> Map(x => x.RevisionDate, "REVTSTMP");
>>
>> Map(x => x.Usuario, "Usuario");
>>
>> }
>>
>> }
>>
>>
>> Btw, The "Usuario" field is being inserted as NULL... It worked before I
>> activated the TrackEntitiesChangedInRevision setting.
>>
>>
>>
>>
>>
>> And please don't ask me to post an Isolated Test or whatever... Our code
>> is a total mess right now and for some freaking reason, an error is
>> occurring when I try to open a session in test environment. We're on a
>> total rush here. The company's president is on our asses these days. Yep,
>> the president.
>>
>> thanks a lot in advance!
>>
>>
>>
>>
>> On Tuesday, February 18, 2014 7:28:59 AM UTC-3, Roger wrote:
>>
>> AFAIK, that ”should” work. Is it one specific query that doesn’t work or
>> is it all of them?
>>
>>
>>
>> How is your configuration object configured?
>>
>>
>>
>> *From:* [email protected] [mailto:[email protected]] *On
>> Behalf Of *Guilherme Paschoal
>> *Sent:* den 17 februari 2014 21:17
>> *To:* [email protected]
>> *Subject:* [nhusers] [Envers] Query from different catalog
>>
>>
>>
>> Hello guys!
>>
>>
>>
>> I successfully got envers to work, saving to a different catalog.
>>
>>
>>
>> My problem is that unfortunately, querying from that catalog, won't work.
>> It queries from the current session's catalog, not from the one I
>> configured in "cfg.SetEnversProperty(ConfigurationKey.DefaultCatalog,
>> "DB_AUDIT");".
>>
>>
>>
>> I've been searching around envers source but I couldn't find any tips on
>> that.
>>
>>
>>
>> Anyone got that one working or has any tips for me?
>>
>>
>>
>> Thanks a lot in advance!
>>
>>
>>
>>
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "nhusers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/nhusers.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "nhusers" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To post to this group, send email to [email protected].
>> Visit this group at http://groups.google.com/group/nhusers.
>> For more options, visit https://groups.google.com/groups/opt_out.
>>
>
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/nhusers.
For more options, visit https://groups.google.com/groups/opt_out.