0

I'm experimenting with Envers. I've got it working okay, except that when it generated the audit table for my audited entity it made all the varchar columns length 1, rather than the length of the corresponding column in the base table.

Like so:

Object: dbo.COMPANY_ADDRESS_TB

Column          | Type
-----------------------------
ID              | int
COMPANY_ID      | int
ADDRESS_SEQ_NUM | int
TYPE            | varchar(40)
ATTN            | varchar(40)
STREET1         | varchar(60)
STREET2         | varchar(60)
STREET3         | varchar(60)
CITY            | varchar(40)
STATE           | varchar(25)
ZIP             | varchar(18)
COUNTRY         | varchar(25)
TIMESTAMP       | binary(8)
ACTIVE          | int

and then

Object: dbo.COMPANY_ADDRESS_TB_AUD

Column            | Type
------------------------------
ID                | int
REV               | int
REVTYPE           | tinyint
REVEND            | int
ADDRESS_SEQ_NUM   | int
addressSeqNum_MOD | bit
TYPE              | varchar(1)
addressType_MOD   | bit
ATTN              | varchar(1)
attn_MOD          | bit
STREET1           | varchar(1)
street1_MOD       | bit
STREET2           | varchar(1)
street2_MOD       | bit
STREET3           | varchar(1)
street3_MOD       | bit
CITY              | varchar(1)
city_MOD          | bit
STATE             | varchar(1)
state_MOD         | bit
ZIP               | varchar(1)
zip_MOD           | bit
COUNTRY           | varchar(1)
country_MOD       | bit
ACTIVE            | int
active_MOD        | bit

Of course I can change the lengths by hand, but if I start auditing a lot of entities that could get both tedious and error-prone. Here's the code that sets this up:

    var properties = new Dictionary<string, string>();
    properties[NHibernate.Cfg.Environment.Dialect] = "NHibernate.Dialect.MsSql2008Dialect";
    properties[NHibernate.Cfg.Environment.ConnectionDriver] = "NHibernate.Driver.SqlClientDriver";
    properties[NHibernate.Cfg.Environment.Hbm2ddlAuto] = "update";
    properties[NHibernate.Cfg.Environment.FormatSql] = "true";
    properties[NHibernate.Cfg.Environment.ShowSql] = "true";
    properties[NHibernate.Cfg.Environment.ConnectionString] = "Data Source=localhost;Initial Catalog=OU_KASH;Integrated Security=True;Asynchronous Processing=true";
    var cfg = new Configuration();
    cfg.Configure()
        .SetProperties(properties)
        .AddAssembly(typeof(AliasTb).Assembly.FullName)
        ;

    cfg.SetEnversProperty(ConfigurationKey.StoreDataAtDelete, true);
    cfg.SetEnversProperty(ConfigurationKey.AuditStrategy, typeof(NHibernate.Envers.Strategy.ValidityAuditStrategy));
    cfg.SetEnversProperty(ConfigurationKey.TrackEntitiesChangedInRevision, true);
    cfg.SetEnversProperty(ConfigurationKey.GlobalWithModifiedFlag, true);

    cfg.IntegrateWithEnvers(new AttributeConfiguration());

Any idea what I might be doing wrong?

4

2 回答 2

1

听起来像一个潜在的错误。请在此处使用最少的映射报告它以重现您的问题(或者更好 - 创建一个测试失败的拉取请求)。

于 2015-10-27T10:46:59.400 回答
0

好吧,我的坏。在尝试将一个最小的示例放在一起时,我创建了一个只有一个 ID 和一个字符串属性的新类。事实证明,为该类生成的模式字符串列的长度也为 1,这意味着它与 Envers 无关,而是我的实体映射错误(在我最初发布的示例中,基表是在遗留数据库中,不是由 NH 生成的)。我玩弄了这些<property>属性并得到了我想要的。

感谢您帮助我度过难关。

于 2015-10-29T08:36:07.413 回答