4

Я пытаюсь использовать отображение Fluent NHibernate для сериализации/десериализации данных.Как сериализовать/десериализовать списки элементов, используя сопоставления Fluent NHibernate?

Начиная с корневой сущности, я использую сопоставление для построения графика со всеми объектами, связанными с этим объектом. Затем я сериализую этот набор объектов.

У меня это отображение (только соответствующие части):

[Serializable] 
public class Foo 
{ 
    public virtual IList<Bar> Bars { get; set;} 
    public virtual IList<System.Guid> Guids { get; set; } 
} 

[Serializable] 
public class Bar 
{ 
    public virtual Foo Foo { get; set; } 
} 

public class BarMap : ClassMap<Bar> 
{ 
    References(x => x.Foo, "idFoo").Not.Nullable(); 
} 

public class FooMap : ClassMap<Foo> 
{ 
    HasMany(x => x.Bars).KeyColumn("idFoo"); 
    HasMany(x => x.Guids).Table("guids").KeyColumn("idFoo").Element("guid").AsBag().Not.LazyLoad(); 
} 

Все работает правильно для Foo и Bar сериализации и десериализации. Но при попытке сохранить десериализованные данные в БД список Guids не сохраняется, хотя его данные находятся в объекте Foo.

Я долго искал язык, но не нашел ничего полезного. Я тоже пробовал с Inverse, но безрезультатно. Я также пытался использовать Cascade.SaveUpdate(), что также не сработало.

Это потому, что он использует дополнительную таблицу для хранения значений как Element s? Это единственная специфика в этом списке, о котором я могу думать.

Что мне не хватает, что мешает этой реставрации работать?

Любая идея приветствуется. Благодарю.

EDIT:

Список Guids сериализации и десериализации правильно. Единственное, что не сделано, это вставка DB списка, но она присутствует в десериализованных данных.

EDIT 2:

Странная часть является то, что другая часть кода в другом месте в проекте делает то же самое, на этот раз успешно. Может быть, это нечеткий параметр конфигурации NHibernate, который отличается с обеих сторон, но mainNH.xml.config - это тот же самый файл каждый раз.

+0

Там, кажется, некоторая путаница здесь. .Net сериализация не имеет ничего общего с сопоставлениями (Fluent) NHibernate. Правильно ли десериализация? То есть вы можете видеть список объектов в объекте после десериализации? –

+0

Какой тип данных имеет указатель столбца? он генерируется с помощью SchemaExport? – Firo

+0

В БД Гиды являются 'UNIQUEIDENTIFIER'. Да, он создается с помощью SchemaExport. –

ответ

1

Вероятно, ваше сохранение/обновление не является каскадным для дочерней коллекции.

Изменить отображение на

HasMany(x => x.Guids).Cascade.SaveUpdate().Table("guids").KeyColumn("idFoo").Element("guid").AsBag().Not.LazyLoad(); 
+0

Нет, значения по-прежнему не сохраняются. Я просто повторил, но на самом деле я уже пробовал это. Извините, я должен был упомянуть об этом. –

+0

Посмотрите на второе редактирование, вот что меня удивляет. –

1

попробуйте добавить Inverse (ложь) в вашем отображении HasMany.

+0

Я не могу указать аргумент метода 'Inverse()'. Во всяком случае, я пробовал как с, так и без 'Inverse()', с тем же результатом. –

1

Попробуйте очистить сеанс перед сохранением и убедитесь, что вы сохранили (а не SaveOrUpdate).

+0

Это не сработало :( –

1

Попробуйте

Session.Merge(bar); 
Session.Merge(bar.Foo); 
Session.SaveUpdate(bar); 
+0

Я не могу этого сделать, поскольку я не знаю тип сущности во время выполнения. Данный пример - это действительно упрощенное сопоставление только с двумя классами, но на самом деле есть десятки. некоторые из них вызывают эту проблему (каждый раз, когда сопоставление является дополнительной таблицей с командой «Элемент»), но я не могу просто разбираться с ними индивидуально, потому что я должен гарантировать, что будущие классы будут обработаны правильно, независимо от их Конфигурация отображения –

+0

Я до сих пор не нашел решения для своей проблемы, поэтому я закончил строительство walkaround. Я по-прежнему награждаю вас щедростью за усилия. –

Смежные вопросы