2011-07-01 53 views
0

我有一個包含類型爲XmlElement的屬性的類。 該屬性被映射爲以下:NHibernate與XMLType合併問題

<property name="XamlForm" column="XamlForm" type="KTN.Base.Data.Types.XmlType, KTN.Base.Data" /> 

進XML類:

[Serializable] 
public class XmlType : IUserType 
{ 
    public new bool Equals(object x, object y) 
    { 
     XmlElement xdoc_x = (XmlElement)x; 
     XmlElement xdoc_y = (XmlElement)y; 

     if (xdoc_x == null && xdoc_y == null) return true; 

     if (xdoc_x == null || xdoc_y == null) return false; 

     return xdoc_y.OuterXml == xdoc_x.OuterXml; 
    } 

    public object NullSafeGet(IDataReader rs, string[] names, object owner) 
    { 
     if (names.Length != 1) 
      throw new InvalidOperationException("names array has more than one element. can't handle this!"); 
     XmlDocument document = new XmlDocument(); 
     string val = rs[names[0]] as string; 
     if (val != null) 
     { 
      document.LoadXml(val); 

      return document.DocumentElement; 
     } 
     return null; 
    } 

    public void NullSafeSet(IDbCommand cmd, object value, int index) 
    { 
     DbParameter parameter = (DbParameter)cmd.Parameters[index]; 
     if (value == null) 
     { 
      parameter.Value = DBNull.Value; 
      return; 
     } 
     parameter.Value = ((XmlElement)value).OuterXml; 
    } 

    public object DeepCopy(object value) 
    { 
     if (value == null) return null; 
     XmlElement other = (XmlElement)value; 
     XmlDocument xdoc = new XmlDocument(); 
     xdoc.LoadXml(other.OuterXml); 
     return xdoc.DocumentElement; /**/ 
    } 

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

    public System.Type ReturnedType 
    { 
     get { return typeof(XmlDocument); } 
    } 

    public bool IsMutable 
    { 
     get { return true; } 
    } 

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

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

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

    public object Replace(object original, object target, object owner) 
    { 
     // Changed return original to return target... 
     return target; 
    } 

} 

調用該函數從NHibernate的合併後,此屬性爲null。 任何想法? 在此先感謝

+0

你可能想在你的Equals fn中檢查null – leeny

回答

0

對於XDocumentXmlDocument NHibernate 3都有開箱類型。

你不應該推出自己的。