0

我有一个Animal实现IDomainObject. 还有另一个类 ,Cat它继承自Animal。我正在为我的 NHibernate 映射使用 Table Per Subclass 继承策略,并将CreatedDateandLastModified属性映射到表中的Animal列和表中的列Cat

我还使用 PreUpdate 事件处理程序为 LastModified 分配一个值。

当我更新 Cat 对象中的属性时,两个 UPDATES 被发送到数据库:一个 forAnimal和一个 for Cat。但是,UPDATE forAnimal是获取新 LastModified 值的那个,而 UPDATE forCat保留旧值。

当在另一个会话中再次检索 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;
}
4

1 回答 1

2

我不明白的两件事:

  1. 为什么在 Cat 类中覆盖 CreatedDate、LastModified 和 Version - 当它们没有新功能时?

  2. 为什么两个表中都有这三列?

在基类中拥有三列/属性就足够了——其他任何事情都是自找麻烦。

于 2010-08-18T18:27:23.233 回答