2010-08-27 2 views
1

Я пытаюсь удалить элемент из одного списка во многие и сохранить его в базе данных. Вот сущности я определили:NHibernate - удалить не нужно в базе данных

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

Со следующими беглых отображений:

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

У меня есть проблема в том, что если я удалить элемент из коллекции SpecialOffer.Types успешно удаляет его из список, но когда я пытаюсь сохранить сеанс, это изменение не сохраняется в базе данных. Я предполагаю, что это как-то связано с составным идентификатором в таблице соединений, так как я смог сделать это успешно в прошлом со стандартным идентификатором.

Я был бы признателен, если бы кто-нибудь мог показать мне, что я делаю неправильно. Спасибо

+0

Можете ли вы опубликовать свой код, показывающий, как вы удаляете элемент из списка? Это может оказаться полезным при устранении неполадок ... – DanP

ответ

1

Думаю, вам нужно 1) изменить настройку каскада на SpecialOffer.Types до Cascade.AllDeleteOrphan() и 2) установить SpecialOfferType.SpecialOffer = null, когда вы удалите его из коллекции. Так как коллекция является обратной стороной отношения, ссылка «много-к-одному» на SpecialOffer на SpecialOfferType должна быть установлена ​​равной нулю, чтобы сделать ее сиротой, а затем Cascade.AllDeleteOrphan приведет к ее удалению.

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