我想从Product中删除ICollection PriceBreaks。
我正在使用以下方法。然而他们似乎没有删除。我错过了什么。 当我一步到位。我注意到“product.PriceBreaks.Clear();”实际上并没有清除这些物品。我需要冲洗还是什么?
public void RemovePriceBreak(int productId) {
using (ISession session = EStore.Domain.Helpers.NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
var product = session.Get<Product>(productId);
// i can see 20 PriceBreak records, tho nh prof saids PriceBreak table hasn't been hit
product.PriceBreaks.Clear();
session.SaveOrUpdate(product);
transaction.Commit(); // PriceBreak table is hit here with select statement, no delete?
}
}
这是我的hbm文件
<class name="Product" table="Products">
<id name="Id" type="Int32" column="Id" unsaved-value="0">
<generator class="identity"/>
</id>
<property name="CompanyId" column="CompanyId" type="Int32" not-null="true" />
<property name="Name" column="Name"/>
<set name="PriceBreaks" table="PriceBreaks" generic="true" cascade="all-delete-orphan" inverse="true" >
<key column="ProductId" />
<one-to-many class="EStore.Domain.Model.PriceBreak, EStore.Domain" />
</set>
</class>
<class name="PriceBreak" table="PriceBreaks">
<id name="Id" type="Int32" column="Id" unsaved-value="0">
<generator class="identity"/>
</id>
<many-to-one name="Product" column="ProductId" not-null="true" class="EStore.Domain.Model.Product, EStore.Domain" />
</class>
我的实体
public class Product
{
public virtual int Id { get; set; }
public virtual ICollection<PriceBreak> PriceBreaks { get; set; }
public virtual void AddPriceBreak(PriceBreak priceBreak)
{
priceBreak.Product = this;
PriceBreaks.Add(priceBreak);
}
}
public class PriceBreak
{
public virtual int Id { get; set; }
public virtual Product Product { get; set; }
}
这是来自nhprof
的sql// SELECT product0_.Id as Id0_0_ 来自产品product0_ 产品0_.Id = 23 / * @ p0 * /
然后
选择pricebreak0_.ProductId作为ProductId1_, pricebreak0_.Id为Id1_, pricebreak0_.Id为Id1_0_, pricebreak0_.ProductId为ProductId1_0_, 来自PriceBreaks pricebreak0_ pricebreak0_.ProductId = 23 / * @ p0 * /
没有更新或选择
答案 0 :(得分:1)
产品可能需要与该会话相关联。看起来您正在尝试保存分离的对象。这意味着没有会话来跟踪该调用以清除PriceBreaks。把它改成这个......
public void RemovePriceBreak(int productId)
{
using (ISession session = EStore.Domain.Helpers.NHibernateHelper.OpenSession())
using (ITransaction transaction = session.BeginTransaction())
{
var product = session.Get<Product>(productId);
product.PriceBreaks.Clear();
session.SaveOrUpdate(product);
transaction.Commit();
}
}
或进一步提升会话和事务管理。这基本上不需要这种方法。
答案 1 :(得分:1)
您是否尝试删除PriceBreak方面的cascade =“all”?
您是否尝试过使用session.Save()而不是SaveOrUpdate()?