2014-11-01 87 views
2

的读写名单我知道我可以像下面使用NHibernateNHibernate的:字符串

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

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

我也希望如果我增加价值列表,也应该保存。我已经看到下面这打破了我们增值列出案例代码...

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

*我的看法,从我的经验... *我不会这样。因为后来,如果你的应用程序会成功,用户将会问你使用'Attachments'中的值进行搜索的功能......这将是非常困难的。我确实在各处都使用实体。即'附件'带有1)ID和2)字符串说明... 3)并返回给持有人。这种方式变得更复杂一些(IList ),但它可以用于搜索(子查询)。无论如何,如果你想使用'IList '分开的表格仍然是最好的选择,我会说。 – 2014-11-01 06:33:46

+0

@RadimKöhler我的问题纯粹是为列表,并与列表无关...不会用户类型更好? – harishr 2014-11-01 16:01:46

+0

如果我有答案,我会把它给你。我的观点是,1)'IList '应该存储在单独的表中。该表将保存对根实体(Holder_ID列)的引用和字符串值(值列)。 2)如果我们已经在那里,我会建议更进一步。我会用它自己的替代关键字来扩展表格,并将其视为一个“附件”或“文件”实体......但保留字符串列表...我没有看到任何优势...不知道这是否有帮助。 .. – 2014-11-01 16:04:38

回答

1

你可以用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(); 
    } 
相关问题