2010-08-18 138 views
0

我有一個Animal類實現IDomainObject。還有另一個類,Cat,從Animal繼承。我爲我的NHibernate映射使用Table Per Subclass繼承策略,並將CreatedDateLastModified屬性映射到Animal表中的列以及Cat表中的列。問題與NHibernate審計和繼承類

我還使用PreUpdate事件處理程序爲LastModified賦值。

當我更新Cat對象中的一個屬性時,會將兩個UPDATES發送到數據庫:一個用於Animal,另一個用於Cat。但是,Animal的更新是獲取新的LastModified值的UPDATE,並且Cat的UPDATE保持舊值。

這會在另一個會話中再次檢索Cat實體時導致一些問題。看起來,LastModified被新的值(來自Animal)覆蓋,有效地標記實體已經變髒,並觸發另一個UPDATE。

我的整體設計似乎有問題,但我不確定它是什麼。什麼是更好的方式去做這件事?

public class Animal : IDomainObject { 
    // ... various properties 

    public virtual DateTime CreatedDate { get; set; } 
    public virtual DateTime LastModified { get; set; } 
    public virtual int Version { get; protected set; } 
} 

public class Cat : Animal { 
    // ... various properties 

    public override DateTime CreatedDate { get; set; } 
    public override DateTime LastModified { get; set; } 
    public override int Version { get; protected set; } 
} 

public interface IDomainObject { 
    DateTime CreatedDate { get; set; } 

    DateTime LastModified { get; set; } 

    int Version { get; } 
} 

public bool OnPreUpdate(PreUpdateEvent eventItem) { 
    if (!(eventItem.Entity is IDomainObject)) { 
     return false; 
    } 

    var entity = eventItem.Entity as IDomainObject; 

    if (entity == null) { 
     return false; 
    } 

    var lastModified = DateTime.Now; 

    PersistState(eventItem.Persister, eventItem.State, "LastModified", lastModified); 

    entity.LastModified = lastModified; 

    return false; 
} 

private void PersistState(IEntityPersister persister, object[] state, string propertyName, object value) { 
    var index = Array.IndexOf(persister.PropertyNames, propertyName); 

    if (index == -1) { 
     return; 
    } 

    state[index] = value; 
} 
+0

我想我只是提取CreateDate,LastModified和版本,並把它們放在它們自己的類和表中,分別通過私有成員和外鍵引用。 – 2010-08-18 17:40:22

回答

2

兩件事情我不明白:

  1. 爲什麼在你的Cat類中重寫了CreatedDate,LastModified和Version - 當他們沒有新的功能時?

  2. 爲什麼你在這三列中都有表?

在基類中擁有三列/屬性應該足夠了 - 其他任何事情都在尋求麻煩。

+0

+1:沒有理由不把它們留在基類中。 – DanP 2010-08-18 19:34:14

+0

這樣做很有意義。謝謝。 – 2010-08-18 20:23:39

+0

我有同樣的問題。不幸的是,管理我們數據庫設計的數據團隊希望在每張表上都有審計專欄有沒有可行的解決方案? – 2014-11-26 02:18:04