将值对象映射为流畅的nhibernate中的主键

时间:2015-08-13 14:07:08

标签: c# nhibernate fluent-nhibernate

我在fluent-nhibernate中映射我的类ProcessingCode。 它有一个属性Code,它是一个ValueObject。 如何将其映射为主键?

以下是我将其映射为主键的方式:

public class ProcessingCodeMap : ClassMap<ProcessingCode>
{
    public ProcessingCodeMap()
    {
        Component(x => x.Code, p => p.Map(x => x.Value).Not.Nullable());
        ... other properties
    }
}

以下是与映射相关的类:

public class ProcessingCode
{
    public virtual Code Code { get; set; }

    //Other properties...
}

public class Code : IEquatable<Code>
{
    public Code()
    {

    }

    public Code(string value)
    {
        Value = value;
    }

    public string Value { get; set; }

    //Some other methods

    public static implicit operator string(Code code)
    {
        if (code == null)
            return null;

        return code.Value;
    }

    public static implicit operator Code(string value)
    {
        return new Code(value);
    }

    public override bool Equals(object obj)
    {
        if (ReferenceEquals(null, obj)) return false;
        if (ReferenceEquals(this, obj)) return true;
        if (obj.GetType() != this.GetType()) return false;
        return Equals((Code)obj);
    }

    public bool Equals(Code other)
    {
        return string.Equals(Value, other.Value);
    }

    public override int GetHashCode()
    {
        return Value.GetHashCode();
    }
}

1 个答案:

答案 0 :(得分:0)

Component方法用于将值对象映射为a类的常规属性。有两种映射ID的方法:Id映射常规类型和CompositeId映射组件。因此,答案是使用CompositeId而非Component来实现“简单”的解决方案:

public class ProcessingCodeMap : ClassMap<ProcessingCode>
{
    public ProcessingCodeMap()
    {
        CompositeId(x => x.Code, p => p.KeyProperty(x => x.Value));
        //... other properties
    }
}

或者,您也可以实现自定义IUserType