我使用enum
的和自定義Selector
類來幫助選擇單選按鈕,下拉列表,複選框等我使用的是NHibernate。通過單個選項(單選按鈕,下拉列表),來自屬性[Display(Name = "[Some Text]")]
的值將填充到數據庫表中(注意:我正在使用擴展名以使用Display(Name)
)。但是,通過多選(複選框,多列表),我無法弄清楚如何將enum
選擇的值存入數據庫。NHibernate:枚舉列出和存儲數據庫中的值
這裏是我的模型的部分(每個單獨的文件)(編輯:我給他們的通用名稱,以免進一步混淆問題):
public enum MyEnum
{
[Display(Name = "Text for enum1")]
enum1,
//Left out 2 - 10 for brevity
[Display(Name = "Text for enum10")]
enum10
}
...
public class MyEnumSelectorAttribute : SelectorAttribute
{
public override IEnumerable<SelectListItem> GetItems()
{
return Selector.GetItemsFromEnum<MyEnum>();
}
}
...
[Display(Name = "This is a checkboxlist (select one or more check boxes)?")]
[MyEnumSelector(BulkSelectionThreshold = 10)]
public virtual List<string> MyEnumCheckBox { get; set; }
...
public List<string> MyEnumCheckBox
{
get { return Record.MyEnumCheckBox; }
set { Record.MyEnumCheckBox = value; }
}
這裏是Selector.cs
類(萬一這是有關的問題),這種幫助的選擇單選按鈕,複選框,下拉菜單等:
public class Selector
{
public IEnumerable<SelectListItem> Items { get; set; }
public string OptionLabel { get; set; }
public bool AllowMultipleSelection { get; set; }
public int BulkSelectionThreshold { get; set; }
public static string GetEnumDescription(string value, Type enumType)
{
var fi = enumType.GetField(value.ToString());
var display = fi
.GetCustomAttributes(typeof(DisplayAttribute), false)
.OfType<DisplayAttribute>()
.FirstOrDefault();
if (display != null)
{
return display.Name;
}
return value;
}
public static IEnumerable<SelectListItem> GetItemsFromEnum<T>
(T selectedValue = default(T)) where T : struct
{
return from name in Enum.GetNames(typeof(T))
let enumValue = Convert.ToString((T)Enum.Parse
(typeof(T), name, true))
select new SelectListItem
{
Text = GetEnumDescription(name, typeof(T)),
Value = enumValue,
Selected = enumValue.Equals(selectedValue)
};
}
}
public static class SelectorHelper
{
public static IEnumerable<SelectListItem> ToSelectList
(this IEnumerable data)
{
return new SelectList(data);
}
public static IEnumerable<SelectListItem> ToSelectList
(this IEnumerable data, string dataValueField,
string dataTextField)
{
return new SelectList(data, dataValueField, dataTextField);
}
public static IEnumerable<SelectListItem> ToSelectList<T>
(this IEnumerable<T> data, Expression<Func<T, object>>
dataValueFieldSelector, Expression<Func<T, string>>
dataTextFieldSelector)
{
var dataValueField = dataValueFieldSelector.ToPropertyInfo().Name;
var dataTextField = dataTextFieldSelector.ToPropertyInfo().Name;
return ToSelectList(data, dataValueField, dataTextField);
}
}
的Selector
類是搭配有一些邏輯來找出哪些挑(單選按鈕,複選框模板Selector.cshtml
,等等。) 。
我收到的各種錯誤試圖要麼List<string>
,List<MyEnum>
,IList<string>
,IList<MyEnum>
,IEnumerable<MyEnum>
和IEnumerable<MyEnum>
。這個錯誤只出現在複選框或多列表中,因爲它們使用了List<string>
。例如,下拉菜單工作正常,沒有錯誤。下面是一個簡單的下拉模型(可以在上面重用enum
)的作品,並允許通過NHibernate的映射到數據庫:
[Required(ErrorMessage = "Please select one option")]
[Display(Name = "This is a dropdown list (select one option)?")]
[MyEnumSelector(BulkSelectionThreshold = 0)] //0 selects dropdown
public virtual MyEnum? MyEnumDropDown { get; set; }
public MyEnum? MyEnumDropDown
{
get { return Record.MyEnumDropDown; }
set { Record.MyEnumDropDown = value; }
}
這裏有一些我基於什麼我已經試過得到錯誤的:
List<string>
錯誤:
NHibernate.Transaction.ITransactionFactory - DTC transaction prepre phase failed NHibernate.PropertyAccessException: Invalid Cast (check your mapping for property type mismatches); setter of MyNameSpace.Models.MyRecord ---> System.InvalidCastException: Unable to cast object of type 'NHibernate.Collection.Generic.PersistentGenericBag
1[System.String]' to type 'System.Collections.Generic.List
1[System.String]'.
List<MyEnum>
錯誤:
NHibernate.Transaction.ITransactionFactory - DTC transaction prepre phase failed System.InvalidCastException: Unable to cast object of type 'System.Collections.Generic.List
1[MyNameSpace.Models.MyEnum]' to type 'System.Collections.Generic.ICollection
1[System.String]'.
IList<string>
錯誤:
System.Collections.Generic.List
1[MyNameSpace.Models.MyEnum]' to type 'System.Collections.Generic.ICollection
1[System.String]'.
任何想法:
NHibernate.AdoNet.AbstractBatcher - Could not execute command: INSERT INTO MyEnumCheckBox (MyRecord_id, Value) VALUES (@p0, @p1) System.Data.SqlServerCe.SqlCeException (0x80004005): The specified table does not exist. [ MyEnumCheckBox ]
我嘗試了類似的錯誤,但如果我用<MyEnum>
它會顯示這樣的錯誤的其他變化在嘗試使用NHibernate插入多個選定的enum
時如何在此場景中使用enum
?
不,我得到一個不同的錯誤。我做了至少六(6)個變化,這是最初的錯誤。我認爲我得到的一個錯誤是「無法插入集合......指定的表不存在」 –
那麼,由於PersistentGenericBag <>顯然不是List <>,因此應該忘記該錯誤。嘗試使用例如IList <>代替。這種情況下的完整錯誤信息更有趣。 –
感謝您的回覆。對不起,如果我誤解:你是否希望我在使用IList <>'的情況下發布錯誤信息?問題是,我使用IList或IList <[我的枚舉名稱]>'? –