【问题标题】:Envers generating audit-table schemas with all varchars length 1Envers 生成所有 varchar 长度为 1 的审计表模式
【发布时间】:2015-10-26 20:55:39
【问题描述】:

我正在尝试使用 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());

知道我做错了什么吗?

【问题讨论】:

    标签: nhibernate nhibernate-envers


    【解决方案1】:

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

    【讨论】:

    • 谢谢。我会按照你的建议去做,但我不熟悉你的后续建议:如何“创建一个失败的测试请求”?
    【解决方案2】:

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

    感谢您帮助我解决这个问题。

    【讨论】:

      猜你喜欢
      • 2015-08-20
      • 2016-03-19
      • 1970-01-01
      • 2016-11-15
      • 2023-03-24
      • 2015-02-22
      • 2013-06-28
      • 2015-12-14
      • 2018-09-19
      相关资源
      最近更新 更多