Свойство NHibernate Mapping, которое зависит от другого свойства - PullRequest
1 голос
/ 09 марта 2012

У меня есть следующий класс:

public class Widget {        
    public virtual int Id { get; set; }

    [Required]
    public virtual WidgetType Type { get; set; }

    public virtual string SerializedParameters {
        get {
            return new XmlSerializer(Parameters.GetType()).Serialize(Parameters);
        } set {
            Parameters = new XmlSerializer(Assembly
                     .LoadFrom(Server.MapPath(Type.ModelAssembly))
                         .GetType(Type.ModelClass)
                ).Deserialize(value);
        }
    }

    private object _parameters;
    public virtual object Parameters {
        get {
            if (_parameters == null)
                _parameters = Activator.CreateInstance(Assembly
                        .LoadFrom(Server.MapPath(Type.ModelAssembly))
                            .GetType(Type.ModelClass)
                    );
            return _parameters;
        } set { _parameters = value; }
    }
}

Свойство Parameters не сопоставлено с базой данных, а свойство SerializedParameters. Однако, когда он пытается получить информацию из базы данных и установить SerializedParameters (который впоследствии устанавливает параметры), свойство Type имеет значение null, и поэтому выдается исключение. Я думаю, это зависит от порядка, в котором NHibernate устанавливает свойства для виджета, но я не могу заставить его работать.

Мне было интересно, есть ли способ обойти это. Ценю помощь. Спасибо

1 Ответ

0 голосов
/ 13 марта 2012

перенес десериализацию в геттер из сеттера, потому что, как вы сказали, тип еще не существует

public class Widget
{
    public virtual int Id { get; set; }
    public virtual WidgetType Type { get; set; }

    private string _serializedParameters;
    private virtual string SerializedParameters {
        get
        {
            return new XmlSerializer(Parameters.GetType()).Serialize(Parameters);
        }
        set
        {
            _serializedParameters = value;
        }
    }
    private object _parameters;
    public virtual object Parameters
    {
        get
        {
            if (_parameters == null)
            {
                if (!string.IsNullOrEmpty(serializedParameters))
                {
                    // code to deserialize the Parameters and set to Parameters
                    _parameters = new XmlSerializer(Assembly
                             .LoadFrom(Server.MapPath(Type.ModelAssembly))
                             .GetType(Type.ModelClass)
                         ).Deserialize(value);
                }
                else
                {
                    // no existing parameters, then create new object
                    _parameters = Activator.CreateInstance(Assembly.LoadFrom(Server.MapPath("~/bin/" + widget.Type.ParametersAssembly + ".dll")).GetType(widget.Type.ParametersClass));
                }
            }
            return _parameters;
        }
        set { _parameters = value; }
    }
}
...