Nhibernate ValueType Collection в виде строки с разделителями в БД - PullRequest
2 голосов
/ 26 ноября 2008

У меня есть устаревшая база данных, которую я сопоставляю с Nhibernate. И в нескольких местах список och strigs или доменных объектов отображается как строка с разделителями в базе данных. Либо 'string | string | string' в случаях типа значения, либо как 'domainID | domainID | domainID' в случаях типа ссылок.

Я знаю, что могу создать фиктивное свойство для класса и сопоставить его с этими полями, но я хотел бы сделать это более понятным способом, например, при отображении Enums в качестве их строкового представления с классом EnumStringType .

Является ли IUserType подходом?

Заранее спасибо / Johan

1 Ответ

5 голосов
/ 27 ноября 2008

Я использую это:

public class DelimitedList : IUserType
{
    private const string delimiter = "|";

    public new bool Equals(object x, object y)
    {
        return object.Equals(x, y);
    }

    public int GetHashCode(object x)
    {
        return x.GetHashCode();
    }

    public object NullSafeGet(IDataReader rs, string[] names, object owner)
    {
        var r = rs[names[0]];
        return r == DBNull.Value 
            ? new List<string>()
            : ((string)r).SplitAndTrim(new [] { delimiter });
    }

    public void NullSafeSet(IDbCommand cmd, object value, int index)
    {
        object paramVal = DBNull.Value;
        if (value != null)
        {
            paramVal = ((IEnumerable<string>)value).Join(delimiter);
        }
        var parameter = (IDataParameter)cmd.Parameters[index];
        parameter.Value = paramVal;
    }

    public object DeepCopy(object value)
    {
        return value;
    }

    public object Replace(object original, object target, object owner)
    {
        return original;
    }

    public object Assemble(object cached, object owner)
    {
        return cached;
    }

    public object Disassemble(object value)
    {
        return value;
    }

    public SqlType[] SqlTypes
    {
        get { return new SqlType[] { new StringSqlType() }; }
    }

    public Type ReturnedType
    {
        get { return typeof(IList<string>); }
    }

    public bool IsMutable
    {
        get { return false; }
    }
}

SplitAndTrim - это мое собственное расширение строки. Затем в классе (используя ActiveRecord для отображения):

[Property(ColumnType = "My.Common.Repository.UserTypes.DelimitedList, My.Common.Repository")]
public virtual IList<string> FooBar { get; set; }
...