gpt4 book ai didi

c# - 休眠 : read write list of string

转载 作者:太空宇宙 更新时间:2023-11-03 13:15:07 26 4
gpt4 key购买 nike

我知道我可以使用 nhibernate 读写字符串列表,如下所示

HasMany(x => x.Attachments)
.KeyColumn("RowId")
.Table("PostTable").Element("PostKey");

但这会创建一个额外的表,有没有办法,例如UserType或其他东西,以便我们可以直接写入列表...如果是,是否有使用 nhibernate 的自定义 UserType 的示例?带有示例代码...

我还希望如果我向列表添加值,那么也应该保存。我已经看到下面的示例代码,如果我们向列表添加值,它会中断......

   private virtual string StringValue
public virtual IList<string> valueList
{
get { return StringValue; }
set { StringValue = string.Join(value, "|"); }
}

最佳答案

您可以像这样使用 IUserType 执行此操作:

public class DelimitedList : IUserType
{
private const string delimiter = "|";

public new bool Equals(object x, object y)
{
return object.Equals(x, y);
}

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

public object NullSafeGet(IDataReader rs, string[] names, object owner)
{
var r = rs[names[0]];
return r == DBNull.Value
? new List<string>()
: ((string)r).SplitAndTrim(new [] { delimiter });
}

public void NullSafeSet(IDbCommand cmd, object value, int index)
{
object paramVal = DBNull.Value;
if (value != null)
{
paramVal = ((IEnumerable<string>)value).Join(delimiter);
}
var parameter = (IDataParameter)cmd.Parameters[index];
parameter.Value = paramVal;
}

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 SqlType[] { new StringSqlType() }; }
}

public Type ReturnedType
{
get { return typeof(IList<string>); }
}

public bool IsMutable
{
get { return false; }
}
}

然后将 IList 属性定义为 type="MyApp.DelimitedList, MyApp"。

注意:SplitAndTrim 是一个字符串扩展,具有我创建的各种覆盖。这是核心方法:

public static IList<string> SplitAndTrim(this string s, StringSplitOptions options, params string[] delimiters)
{
if (s == null)
{
return null;
}
var query = s.Split(delimiters, StringSplitOptions.None).Select(x => x.Trim());
if (options == StringSplitOptions.RemoveEmptyEntries)
{
query = query.Where(x => x.Trim() != string.Empty);
}
return query.ToList();
}

关于c# - 休眠 : read write list of string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26686494/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com