C # и Nhibernate — сохранение списка элементов одного объекта в другом

#c# #nhibernate #fluent-nhibernate

#c# #nhibernate #свободно-nhibernate

Вопрос:

У меня здесь проблема, и у меня нет идей для ее решения.

У меня есть 2 класса:

 public class Previa
    {
        public virtual int Id { get; set; }
        public virtual DateTime Date { get; set; }
        public virtual string Description { get; set; }
        public virtual IList<ItemPrevia> ListItemPrevia{ get; set; }
    }

public class ItemPrevia
    {
        public virtual int Id { get; set; }
        public virtual string Description { get; set; }  
        public virtual decimal Price { get; set; }
        public virtual Previa Previa { get; set; }
    }
  

и сопоставление:

 public class PreviaMap : ClassMap<Previa>
    {
        public PreviaMap()
        {
            Id(f => f.Id)
                .Length(11);
            Map(f => f.Date)
                .Not.Nullable();
            Map(f => f.Description)
                .Not.Nullable();
            HasMany<ItemPrevia>(m => m.ListItemPrevia)
                .Table("ItemPrevia")
                .Inverse()
                .Cascade.AllDeleteOrphan()
                .Not.LazyLoad();
        }
   }
public class ItensPreviaMap : ClassMap<ItemPrevia>
{
    public ItensPreviaMap()
    {
        Id(f => f.Id)
            .Length(11);
        Map(f => f.Description)
                .Not.Nullable();
            Map(f => f.Price)
                .Not.Nullable();
        References(f => f.Previa).Column("IdPrevia").Not.LazyLoad();
     }
 }
  

В моей системе я должен зарегистрировать Previa, а после включить некоторые ItemPrevia.
Но я могу сообщить другую предысторию и скопировать ваши элементы в текущую предысторию.

Как я мог бы сохранить список других предысторий для текущего предыстории? Я пытаюсь это:

 Previa objPreviaOld = new Previa();
objPreviaOld = PreviaBLL.Search(Convert.ToInt32(txtPreviaOld.Text));
if (objPreviaOld != null) 
{
      foreach (ItemPrevia objItemPrevia in objPreviaOld.ListItemPrevia)
      {
          objItemPrevia.Id = 0;
          objItemPrevia.Previa = objPrevia;
          objPrevia.ListItemPrevia.Add(objItemPrevia);
      }
      PreviaBLL.Alter(objPrevia);
}
  

Но возникает эта ошибка: идентификатор экземпляра домена.Сущности.Значение ItemPrevia было изменено с 50 на 0

Кто-нибудь мне поможет?

Комментарии:

1. Это происходит потому, что вы логически обновляете объекты, даже если вы думаете, что добавляете их. Вместо этого попробуйте использовать конструктор для создания новых объектов и копирования значений.

Ответ №1:

как сказал @Merlyn Morgan-Graham, вам нужно скопировать данные в новые объекты.

 Previa PreviaOld = PreviaBLL.Search(Convert.ToInt32(txtPreviaOld.Text));
if (objPreviaOld != null) 
{
      foreach (ItemPrevia itemPrevia in objPreviaOld.ListItemPrevia)
      {
          PreviaNew.ListItemPrevia.Add(new ItemPrevia
          {
              Previa = PreviaNew,
              Prop1 = itemPrevia.Prop1,
              Prop2 = itemPrevia.Prop2,
              Prop3 = itemPrevia.Prop3,
              Prop4 = itemPrevia.Prop4,
          });
      }
      PreviaBLL.Alter(PreviaNew);
}