nhibernate mapping: Une collection avec cascade = "all-delete-orphelin" n'était plus référencée
J'ai des probs avec mon couramment mappages. J'ai une entité avec un enfant collection d'entités-je.e Événement et EventItems par exemple.
Si j'ai mis ma cascade de cartographie de la collection de AllDeleteOrphan j'obtiens l'erreur suivante lors de l'enregistrement d'une nouvelle entité de la DB:
NHibernate.HibernateException : Une collection avec cascade="all-delete-orphan" n'était plus référencé par l'entité propriétaire, exemple: de Base.De l'événement.EventItems
Si j'ai mis la cascade à Tous, il fonctionne très bien? Ci-dessous sont mes classes et les fichiers de mappage:
public class EventMap : ClassMap<Event>
{
public EventMap()
{
Id(x => x.Id, "Id")
.UnsavedValue("00000000-0000-0000-0000-000000000000")
.GeneratedBy.GuidComb();
Map(x => x.Name);
HasMany(x => x.EventItems)
.Inverse()
.KeyColumn("EventId")
.AsBag()
.Cascade.AllDeleteOrphan();
}
}
public class EventItemMap : SubclassMap<EventItem>
{
public EventItemMap()
{
Id(x => x.Id, "Id")
.UnsavedValue("00000000-0000-0000-0000-000000000000")
.GeneratedBy.GuidComb();
References(x => x.Event, "EventId");
}
}
public class Event : EntityBase
{
private IList<EventItem> _EventItems;
protected Event()
{
InitMembers();
}
public Event(string name)
: this()
{
Name = name;
}
private void InitMembers()
{
_EventItems = new List<EventItem>();
}
public virtual EventItem CreateEventItem(string name)
{
EventItem eventItem = new EventItem(this, name);
_EventItems.Add(eventItem);
return eventItem;
}
public virtual string Name { get; private set; }
public virtual IList<EventItem> EventItems
{
get
{
return _EventItems.ToList<EventItem>().AsReadOnly();
}
protected set
{
_EventItems = value;
}
}
}
public class EventItem : EntityBase
{
protected EventItem()
{
}
public EventItem(Event @event, string name):base(name)
{
Event = @event;
}
public virtual Event Event { get; private set; }
}
Assez perplexe ici. Des conseils très apprécié.
Chev
source d'informationauteur Chev | 2010-01-24
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin de la carte _EventItems l'aide d'une stratégie d'accès de sorte que NHibernate accès privé membre au lieu de la propriété. Vous obtenez cette erreur, en raison de la collection de référence est modifié lorsque la liste est copié à une nouvelle Liste dans
_EventItems.ToList<EventItem>()
. Essayez ceci:Je ne pense pas que l'on a accepté la réponse est une approche élégante. Le problème ici est que, Chev est la lecture des Événements à partir de la base de données et l'attribution d'un nouveau
EventItem
liste à laEventItems
de la propriété. NHibernate lève cette exception lorsque vous ignorez les enfants précédents de la liste et attribuer une nouvelle liste d'enfants.Ce que vous devez faire ici est,
Si vous voulez vous débarrasser de la vieille
EventItems
faire ceci à la place:Cochez cette SORTE de poste: NHibernate: Supprimer un enregistrement enfant du parent collection
Les commentaires de la accepté de répondre a des questions semblables.
Vous pouvez essayez de supprimer
AsReadOnly
pour votreEventItems
pour vérifier si c'est la cause.