NHibernate - 映射抽象不可变值对象

时间:2014-02-03 06:57:56

标签: c# nhibernate fluent-nhibernate nhibernate-mapping fluent-nhibernate-mapping

我有以下域模型,我需要在Fluent NHibernate的帮助下保存在数据库中:

public class Entity
{
    public Guid Id { get; set; }
    public IValueObject AnyValueObject { get; set; }
}

public interface IValueObject
{
    string Value { get; }
}

public class ValueObject : IValueObject
{
    private readonly string _value;

    public ValueObject(string value)
    {
        _value = value; // null checks omitted for brevity
    }

    public string Value { get { return _value; }}
}

public class AnotherValueObject : IValueObject
{
    private readonly string _value;
    private readonly string _anotherValue;

    public AnotherValueObject(string value, string anotherValue)
    {
        _value = value; // null checks omitted for brevity
        _anotherValue = anotherValue;
    }

    public string Value { get { return _value; } }
    public string AnotherValue { get { return _anotherValue; } }
}

ValueObject和AnotherValueObject没有任何ID,并且它们是不可变的。

问题是我不知道如何为AnyValueObject属性编写地图。我知道值对象必须映射为组件,但如何处理抽象的不可变值对象?

1 个答案:

答案 0 :(得分:2)

您必须给它一个ID或避免多态,因为NH不支持组件的多态性,并且需要实体的ID。

如果它是一个相当简单的继承,只有几个不同的类而没有逻辑,我会把它全部放在同一个类中。反正它简单得多。然后你可以将它映射为一个组件。你可以给它一个枚举,轻松检查它的类型。

如果你真的(真的)需要继承/多态,你需要给它一个ID。