1

У меня есть простой класс с IList<string>. Как сопоставить это свойство в Fluent Nhibernate?Fluent Nhibernate List <string> map

[Serializable] 
public class ExportTask 
{ 
    private IList<string> _csvExportList = new List<string>(); 

    public ExportTask() 
    {} 

    public virtual IList<string> CsvExportList 
    { 
     get { return _csvExportList; } 
     set { _csvExportList = value; } 
    } 
} 

public class ExportTaskMap : SubclassMap<ExportTask> 
{ 
    public ExportTaskMap() 
    {   
     HasMany(x => x.CsvExportList) 
       .Element("CsvExportList") 
       .Cascade 
       .AllDeleteOrphan(); 
    } 
} 

следующая ошибка:

Initializing -failed to lazily initialize a collection of role: MyApp.Tasks.ExportTask.CsvExportList, no session or session was closed 

При вызове AddRange на коллекции:

var exportList = new List<string>() 
        { 
         {"item1"}, 
         {"item2"} 
         }; 

CsvExportList.AddRange(exportList); 

ответ

4

Это truns, что мы можем использовать AsList отображение с колонкой для индекса списка и allworks велик. Интересно, почему нет таких ответов для этой простой утилиты. Надеюсь, это поможет кому-то.

public class ExportTaskMap : SubclassMap<ExportTask> 
{ 
    public ExportTaskMap() 
    {   
    HasMany(x => x.CsvExportList) 
      .Element(@"CsvProperty") 
      .KeyColumn(@"ExportTask_id") 
      .Table(@"CsvExportProperties") 
      .AsList(x => x.Column(@"CsvPropertyListIndex")) 
      .Not.LazyLoad(); 
    } 
} 

И отображенная таблица будет выглядеть следующим образом в базе данных.

enter image description here

+0

Это не работает с IList , но только с IList , любая идея почему? Столбец индекса всегда равен нулю. – Rafi

+0

Вы не можете использовать этот стиль отображения для сопоставления списка объектов. Есть и другие способы сделать это. – jero2rome

0

было бы полезно, чтобы увидеть ошибку вы получите, но одна вещь, кажется очевидным: вы отсутствующий сеттерIList<string> CsvExportList. Таким образом, отображение должно предназначаться поле

HasMany<string>(Reveal.Property<string>("_csvExportList")) 

Проверьте это, как обрабатывать отображение поля:

Или изменить IList<string> иметь по крайней мере защищенному сеттер (Я лично пошел бы так) и удалил настройку только для чтения.

private IList<string> _csvExportList; 
public virtual IList<string> CsvExportList 
{ 
    get { return _csvExportList ?? (_csvExportList = new List<string>(); } 
    protected set { _csvExportList = value; } 
} 

Эти намеки, исключение или ошибки вы получаете может рассказать нам больше

+0

Дополнительное сообщение об ошибке. HasMany (Reveal.Property ("_csvExportList")) не может использоваться, поскольку синтаксис приводит к ошибке. Кроме того, не может быть сеттер, поскольку поля readonly не могут иметь сеттер. Я использую методы Add() и AddRange() для заполнения коллекции. – jero2rome

+0

Честно ... Я не видел только что прочитанного. Почему он там? Это не имеет смысла для меня, это только приносит вам проблемы. Если вы хотите скрыть CsvExportList на любой верхний уровень, скройте его сеттер (сделайте его защищенным). Достаточно. И полученная вами ошибка связана с фактом, что вы работаете с сущностью ExportTask после закрытия сеанса. Вы должны продлить срок службы этого сеанса или загрузить эту коллекцию ... НО я бы пошел с защищенным установщиком точно ... –