1

我有这个版本化属性的实现

public class VersionedProperty<T>: Dictionary<int, T>, IParentEntityTracker //where T:IComparable<T>
{
    [BsonIgnore]
    public IVersionableEntity ParentEntity { get; set; }

    public VersionedProperty()
    {
    }

    public VersionedProperty(IVersionableEntity parentEntity)
    {
        ParentEntity = parentEntity;
    }

    public T Value
    {
        set
        {
            var curVal = Value;
            if (EqualityComparer<T>.Default.Equals(curVal, value))
                return;

            ParentEntity.AtLeastOneVersionedPropertyModified = true;
            this[ParentEntity.Version + 1] = value;
        }
        get
        {
            var key = ParentEntity.Version + (ParentEntity.AtLeastOneVersionedPropertyModified ? 1 : 0);
            var keys = Keys.Where(k => k<=key).ToList();
            if (!keys.Any())
                return default(T);
            var max = keys.Max();
            T res;
            TryGetValue(max, out res);
            return res;
        }
    }
}

最初,我在文档中创建了一些未版本化的属性。让我们说

public class Product
{
public Decimal Price{get;set;}
}

一段时间后,我意识到我做错了,我应该使用版本化属性

public class Product
{
public VersionedProperty<Decimal> Price{get;set;}
}

我想要的是现有文档中的旧值自动反序列化到这个版本化属性中,以避免在集合上编写更新查询。是否有可能以某种方式干扰反序列化过程?

这可能会有所帮助:我使用 postsharp 为自动属性创建版本化属性的空实例。我的 postharp 方面还将父实体的引用分配给新创建的版本化属性的空实例的 ParentEntity 属性。

4

0 回答 0