这个我做的毕业设计中遇到的问题,在单选题表里存储多个选项内容!
![](/images/cnblogs_com/xhan/danxuanB.jpg)
下面是我的单选类和选项类
public class Choice
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
private int index;
![](/Images/OutliningIndicators/InBlock.gif)
public virtual int Index
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return index; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ index = value; }
}
private string value;
![](/Images/OutliningIndicators/InBlock.gif)
public virtual string Value
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return this.value; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ this.value = value; }
}
public string GetXML()
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return "<Choice index=\""+Index+"\"><![CDATA["+Value+"]]></Choice>";
}
}
public class DanXuan
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
private long id;
![](/Images/OutliningIndicators/InBlock.gif)
public long ID
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return id; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ id = value; }
}
private string content;
![](/Images/OutliningIndicators/InBlock.gif)
public virtual string Content
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return content; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ content = value; }
}
private IList<Choice> choices=new List<Choice>();
![](/Images/OutliningIndicators/InBlock.gif)
public virtual IList<Choice> Choices
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return choices; }
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
set
{ choices = value; }
}
}
下面是用来从一个字段读写选项集合的自定义类型类
public class ChoiceList : IUserType
![](/Images/OutliningIndicators/ExpandedBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
private static SqlType[] TYPES = new SqlType[]
{ new SqlType(DbType.String) };
![](/Images/OutliningIndicators/InBlock.gif)
public bool IsMutable
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return false; }
}
public Type ReturnedType
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
get
{ return typeof(IList<Choice>); }
}
![](/Images/OutliningIndicators/InBlock.gif)
public SqlType[] SqlTypes
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
get
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return TYPES;
}
}
![](/Images/OutliningIndicators/InBlock.gif)
public object DeepCopy(object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IList<Choice> sourceList = (IList<Choice>)value;
IList<Choice> targetList = new List<Choice>();
foreach (Choice choice in sourceList)
targetList.Add(choice);
return targetList;
}
![](/Images/OutliningIndicators/InBlock.gif)
public new bool Equals(object x, object y)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (x == y) return true;
if (x != null && y != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
IList<Choice> listX = (IList<Choice>)x;
IList<Choice> listY = (IList<Choice>)y;
if (listX.Count != listY.Count) return false;
for (int i = 0; i < listX.Count; i++)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (listX[i] != listY[i]) return false;
}
return true;
}
return true;
}
![](/Images/OutliningIndicators/InBlock.gif)
public int GetHashCode(object x)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return x.GetHashCode();
}
![](/Images/OutliningIndicators/InBlock.gif)
public object Assemble(object cached, object owner)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return DeepCopy(cached);
}
![](/Images/OutliningIndicators/InBlock.gif)
public object Disassemble(object value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return DeepCopy(value);
}
![](/Images/OutliningIndicators/InBlock.gif)
public object NullSafeGet(IDataReader rs, string[] names, object owner)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string value = (string)NHibernateUtil.String.NullSafeGet(rs, names[0]);
if (value == null)
return null;
else
return ParseChoices(value);
}
![](/Images/OutliningIndicators/InBlock.gif)
public void NullSafeSet(IDbCommand cmd, object value, int index)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (value != null)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string str = AssembleChoices((IList<Choice>)value);
NHibernateUtil.String.NullSafeSet(cmd, str, index);
}
else
NHibernateUtil.String.NullSafeSet(cmd, value, index);
}
![](/Images/OutliningIndicators/InBlock.gif)
public object Replace(object original, object target, object owner)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
return original;
}
![](/Images/OutliningIndicators/InBlock.gif)
private IList<Choice> ParseChoices(string value)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
XmlTextReader tr = new XmlTextReader(value, XmlNodeType.Element, null);
IList<Choice> choiceList = new List<Choice>();
while (tr.Read())
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
if (tr.NodeType == XmlNodeType.Element)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
Choice item = new Choice();
item.Index = int.Parse(tr.GetAttribute(0));
![](/Images/OutliningIndicators/InBlock.gif)
tr.Read();
item.Value = tr.Value;
![](/Images/OutliningIndicators/InBlock.gif)
choiceList.Add(item);
}
}
![](/Images/OutliningIndicators/InBlock.gif)
![](/Images/OutliningIndicators/InBlock.gif)
return choiceList;
}
private string AssembleChoices(IList<Choice> choices)
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
string str="";
foreach (Choice choice in choices)
str += choice.GetXML();
return str;
}
![](/Images/OutliningIndicators/InBlock.gif)
}
配置文件
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="Test" namespace="Test">
<class name="DanXuan" table="DanXuan" lazy="false">
![](/Images/OutliningIndicators/None.gif)
<id name="ID" column="ID">
<generator class="identity" />
</id>
![](/Images/OutliningIndicators/None.gif)
<property name="Content" column="QContent"/>
<property name="Choices" column="Choices" type="Test.ChoiceList,Test"/>
![](/Images/OutliningIndicators/None.gif)
</class>
</hibernate-mapping>