2010-08-27 5 views
1

J'essaie de supprimer un élément d'une liste un à plusieurs et de le conserver dans la base de données. Voici les entités que j'ai définies:NHibernate - Supprimer ne pas persister dans la base de données

public class SpecialOffer 
{ 
    public virtual int SpecialOfferID { get; set; } 
    public virtual string Title { get; set; } 
    public virtual IList<SpecialOfferType> Types { get; private set; } 

    public SpecialOffer() 
    { 
     Types = new List<SpecialOfferType>(); 
    } 
} 

public class SpecialOfferType 
{ 
    public virtual SpecialOffer SpecialOffer { get; set; } 
    public virtual Type Type { get; set; } 
    public virtual int MinDaysRemaining { get; set; } 

    #region composite id requirements 
    public override bool Equals(object obj) 
    { 
     if (obj == null || !(obj is SpecialOfferType)) 
      return false; 

     var t = (SpecialOfferType)obj; 

     return SpecialOffer.SpecialOfferID == t.SpecialOffer.SpecialOfferID && Type.TypeID == t.Type.TypeID; 
    } 

    public override int GetHashCode() 
    { 
     return (SpecialOffer.SpecialOfferID + "|" + Type.TypeID).GetHashCode(); 
    } 
    #endregion 
} 

public class Type 
{ 
    public virtual int TypeID { get; set; } 
    public virtual string Title { get; set; } 
    public virtual decimal Price { get; set; } 
} 

Avec les applications couramment suivantes:

public class SpecialOfferMap : ClassMap<SpecialOffer> 
{ 
    public SpecialOfferMap() 
    { 
     Table("SpecialOffers"); 
     Id(x => x.SpecialOfferID); 
     Map(x => x.Title); 
     HasMany(x => x.Types) 
      .KeyColumn("SpecialOfferID") 
      .Inverse() 
      .Cascade.All(); 
    } 
} 

public class SpecialOfferTypeMap : ClassMap<SpecialOfferType> 
{ 
    public SpecialOfferTypeMap() 
    { 
     Table("SpecialOfferTypes"); 
     CompositeId() 
      .KeyReference(x => x.SpecialOffer, "SpecialOfferID") 
      .KeyReference(x => x.Type, "TypeID"); 
     Map(x => x.MinDaysRemaining); 
    } 
} 

public class TypeMap : ClassMap<Type> 
{ 
    public TypeMap() 
    { 
     Table("Types"); 
     Id(x => x.TypeID); 
     Map(x => x.Title); 
     Map(x => x.Price); 
    } 
} 

Le problème est que j'ai si je supprimer un élément de la collection SpecialOffer.Types il supprime avec succès de la liste mais quand j'essaye de sauver la session le changement n'est pas persistant dans la base de données. Je suppose que c'est quelque chose à voir avec l'ID composite sur la table de jointure puisque j'ai pu le faire avec succès dans le passé avec un identifiant standard.

J'apprécierais que quelqu'un puisse me montrer ce que je fais mal. Merci

+0

Pouvez-vous poster votre code montrant comment vous supprimez l'élément de la liste? Cela peut s'avérer utile pour résoudre ce problème ... – DanP

Répondre

1

Je pense que vous devez 1) Modifier le paramètre de cascade sur SpecialOffer.Types à Cascade.AllDeleteOrphan() et 2) définir SpecialOfferType.SpecialOffer = null lorsque vous le retirez de la collection. Comme la collection est l'inverse de la relation, la référence many-to-one à SpecialOffer sur SpecialOfferType doit être définie sur null pour en faire un orphelin, alors Cascade.AllDeleteOrphan provoquera sa suppression.

Questions connexes