2014-11-01 41 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(); 
    }