代码之家  ›  专栏  ›  技术社区  ›  nfplee

NHibernate-删除数据库中不存在的内容

  •  1
  • nfplee  · 技术社区  · 14 年前

    我正在尝试从一对多列表中删除一个项目,并将其保留在数据库中。以下是我定义的实体:

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

    我的问题是,如果我从特殊服务类型集合成功地将其从列表中删除,但当我尝试保存会话时,更改不会持久化到数据库中。我假设这与连接表上的复合id有关,因为我过去已经能够用标准id成功地做到这一点。

    如果有人能告诉我我做错了什么,我会很感激的。谢谢

    1 回复  |  直到 14 年前
        1
  •  1
  •   Jamie Ide    14 年前

    我认为你必须1)改变级联设置特殊服务类型到 Cascade.AllDeleteOrphan() SpecialOfferType.SpecialOffer = null 从集合中移除时。由于集合是关系的反面,因此必须将SpecialOfferType上对SpecialOffer的多对一引用设置为null,使其成为孤立引用,然后Cascade.alldelete孤儿将导致它被删除。