2011-10-14 23 views
2

我對NHibernate 3.1使用流利的NHibernate 1.2。我有一個類:流利的NHibernate的自動映射字符串與nvarchar的列表(最大)

public class Marks 
{ 
    public virtual int Id { get; set; } 
    public virtual IList<string> Answers { get; set; } 
} 

在該商標類別的映射,我有:

HasMany(m => m.Answers).Element("Value"); 

當創建的表中,「答案」表中出現以下列創建:

Marks_id (FK, int, not null) 
Value (nvarchar(255), null) 

我想要做的是有價值是nvarchar(最大)。我寧願不爲每個班級的每個班級都做這個,只是爲了這個班級。

我看了這些帖子:first,second,third,但還沒有發現任何有用的東西。

在此先感謝您提供的任何幫助。如果您需要更多信息,請告訴我。

編輯: 這是解決問題的代碼:無論是使用CustomSqlType("nvarchar(max)")或者多一點普遍

HasMany(x => x.Answers).Element("Value", x => x.Columns.Single().Length = 4001); 

回答

3

您可以強制映射string到在映射每一列級長柱子中,設置Length(4001)(SQL Server幻數,在它之上自動創建nvarchar(max))。

自動應用它所有string列在你的實體,您可以編寫自己的FluentNHibernate convention

public class LongStringConvention : IPropertyConvention, IPropertyConventionAcceptance 
{ 
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria) 
    { 
     criteria.Expect(x => x.Type == typeof(string)); 
    } 

    public void Apply(IPropertyInstance instance) 
    { 
     instance.Length(4001); 
    } 
} 

而且在IE一樣,映射容器註冊它:

Fluently.Configure() 
    .Mappings(...) 
    .Conventions.Add<LongStringConvention>() 

應用它可以使用自定義元素映射:

HasMany(x => x.Answers).Element("Value", x => x.Columns.Single().Length = 4001); 
+0

這些都沒有工作。如果我設置Map(m => m.Answers).CustomSqlType(「nvarchar(max)」),我收到錯誤「無法確定類型爲:System.Collections.Generic.IList'1」。即使我不想執行通用選項,但我仍嘗試過,並且列仍然保持默認的255長度。 – shakin

+0

啊,我錯過了你收集的字符串。嘗試'HasMany(m => m.Answers).Element(「Value」,e => e.Length(4001))' – NOtherDev

+0

我非常感謝您的幫助。那也行不通。我不知道它是否會有所幫助,但是如果我查看生成的hbm.xml文件,則元素上有一段我以前沒有看到的長度,但它不適用於列。 '' – shakin

0

自己遇到這個問題,上面的答案對我指出正確的方向最有幫助......但我使用的是稍微更新版本的FluentNH。

對於功能NHibernate 1.3和3.3.1 NH,正確的代碼是:

HasMany(x => x.Answers).Element("Value", x => x.Length(4001)); 
0

上面只有工作的答案爲舊版本的NHibernate的。 如果您嘗試HasMany(x => x.Answers).Element("Value", x => x.Length(4001));你會得到如下:

錯誤屬性或索引 「FluentNHibernate.MappingModel.ColumnMapping.Length」不能 分配到 - 它只是

讀正確的現在這樣做的方法是(NHibernate 4.0.2.4,FluentNHibernate 2.0.1。0):

HasMany(m => m.Answers).Element("Value", e => e.Length(4001))