是否有可能只做某種類型的轉換並直接映射到System.Drawing.Color?我將顏色存儲爲html/css值。即#ffffff。我不想創建一個實現IUserType的自定義類型,它只是System.Drawing.Color的一個包裝。NHibernate映射到System.Drawing.Color
回答
試試這個大小。 NHibernate用戶類型不會替換您想要公開的類型,它只是提供了從存儲的數據庫類型自動映射到.NET類型(在此,從字符串到顏色,反之亦然)的機制。
public class ColorUserType : IUserType
{
public bool Equals(object x, object y)
{
if (ReferenceEquals(x, y)) return true;
if (x == null || y == null) return false;
return x.Equals(y);
}
public int GetHashCode(object x)
{
return x == null ? typeof(Color).GetHashCode() + 473 : x.GetHashCode();
}
public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var obj = NHibernateUtil.String.NullSafeGet(rs, names[0]);
if (obj == null) return null;
var colorString = (string)obj;
return ColorTranslator.FromHtml(colorString);
}
public void NullSafeSet(IDbCommand cmd, object value, int index)
{
if (value == null)
{
((IDataParameter)cmd.Parameters[index]).Value = DBNull.Value;
}
else
{
((IDataParameter)cmd.Parameters[index]).Value = ColorTranslator.ToHtml((Color)value);
}
}
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[] {new SqlType(DbType.StringFixedLength)}; }
}
public Type ReturnedType
{
get { return typeof(Color); }
}
public bool IsMutable
{
get { return true; }
}
}
以下映射應該再工作:
<property
name="Color"
column="hex_color"
type="YourNamespace.ColorUserType, YourAssembly" />
爲了完整,並感謝約什 - 對於這一點,如果你使用FluentNHibernate,你可以這樣映射它:
Map(m => m.Color).CustomTypeIs<ColorUserType>();
我會做這樣的:
我會創造在我的課私有字符串屬性或字段,並映射這個屬性/域至您使用的顏色存儲在數據庫中的列。
然後,我會在我的類中創建一個公共屬性,該屬性返回一個Color,並且在該屬性的getter中,我會將存儲在私有字段/屬性中的字符串轉換爲Color,並在setter,我會將字符串字段/屬性設置爲與給定的顏色值相對應的值。
public class MyEntity
{
private string htmlColorString;
public Color TheColor
{
get { return System.Drawing.ColorTranslator.FromHtml (htmlColorString); }
set
{
htmlColorString = System.Drawing.ColorTranslator.ToHtml(value);
}
}
}
您可以將十六進制轉換爲RGB,然後使用Color.FromArgb()方法。 – 2009-06-30 14:27:49
我會去的弗雷德裏克實施方法和做轉換如下:
轉換十六進制RGB - 每一對十六進制值是RGB分量中的一個 - #23FF00意味着R = 23 ,G = FF,B = 00。
這會給你的int值的每個RGB分量的,你做一些字符串在你的十六進制值解析後:
int.Parse("FF", System.Globalization.NumberStyles.AllowHexSpecifier);
之後,只需調用Color.FromArgb()靜態和你」會有你的顏色。
我會花15分鐘時間寫一個IUserType實現來直接轉換顏色屬性/從顏色屬性,所以你沒有任何魔術屬性鋪設。
這也有,你可以用你的顏色屬性的HQL或LINQ,你將無法使用魔法屬性做,雖然有顏色,這可能不是一個問題的好處。
- 1. 投射到System.Drawing.Color?
- 2. 屬性映射到NHibernate的
- 3. Nhibernate類映射
- 4. NHibernate的映射
- 5. NHibernate映射
- 6. NHibernate包映射
- 7. NHibernate映射
- 8. NHibernate的映射
- 9. Nhibernate映射
- 10. Consuming Nhibernate映射
- 11. C#NHibernate映射
- 12. NHibernate /流利NHibernate映射
- 13. NHibernate的映射,映射對象
- 14. NHibernate映射很慢
- 15. NHibernate - 多表映射?
- 16. NHibernate映射外鍵
- 17. Nhibernate映射的System.Drawing.Image
- 18. 流利Nhibernate映射
- 19. NHibernate映射問題
- 20. NHibernate條件映射
- 21. NHibernate映射錯誤
- 22. nHibernate和sqlite映射
- 23. NHibernate映射問題
- 24. 多態NHibernate映射
- 25. 測試nHibernate映射
- 26. NHibernate視圖映射
- 27. NHibernate映射外鍵
- 28. NHibernate實體映射
- 29. 映射集NHibernate的
- 30. NHibernate的慢映射
爲什麼你不想爲此創建一個用戶類型?它正是你正在試圖做的...... – 2009-06-30 14:26:27
大衛 - 原因是因爲已經有一個類型,System.Drawing.Color,可以使用。爲什麼重新創建該類型? – 2009-06-30 14:34:04
NHibernate用戶類型並沒有取代這種類型,它只是實現了將數據庫字段轉換爲該類型的邏輯。您使用該類型進行映射,將字符串存儲在數據庫中,並將您的屬性公開爲System.Drawing.Color。將發佈代碼... – 2009-06-30 14:38:31