#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);
}