生成所有varchars长度为1的审计表模式的Envers

时间:2015-10-26 20:55:39

标签: nhibernate nhibernate-envers

我正在试验Envers。我的工作正常,但是当它为我的审计实体生成审计表时,它使所有varchar列的长度为1,而不是基表中相应列的长度。

像这样:

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

然后

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

当然我可以手动更改长度,但是如果我开始审核很多可能既乏味又容易出错的实体。以下是设置此内容的代码:

    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());

知道我可能做错了吗?

2 个答案:

答案 0 :(得分:1)

听起来像是一个潜在的错误。请使用最小映射报告here以重现您的问题(甚至更好 - 使用失败的测试创建拉取请求)。

答案 1 :(得分:0)

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

感谢您帮助我完成此任务。