我正在使用NHibernate 3.2,并使用Mapping by Code。
测试用例非常简单 - 我有一个商店和一个产品,由多对多的集合链接。 StoreMap中的多对多集合映射如下:
Set(x => x.Products, x =>
{
x.Fetch(CollectionFetchMode.Subselect);
x.Key(key =>
{
key.Column("StoreId");
key.ForeignKey("FK_StoreProducts_Store");
});
x.Table("StoreProducts");
x.Cascade(Cascade.None);
x.Inverse(true);
},
如果我是正确的,Cascade选项应该允许您选择是否要对类进行级联操作,也要对集合进行级联操作。 NHibernate 3.2允许这些选项,对我来说并不是那么简单:
[Flags]
public enum Cascade
{
None = 0,
Persist = 2,
Refresh = 4,
Merge = 8,
Remove = 16,
Detach = 32,
ReAttach = 64,
DeleteOrphans = 128,
All = 256,
}
我正在使用的示例是下面的示例,我在其中创建测试存储和测试产品,并将其分配给商店。然后我正在重新加载商店,检索第一个产品,更新它,并保存商店。
即使级联设置为“无”,产品仍会更新!这应该发生是正常的吗?
using (var session = SessionFactory.OpenSession())
{
long storeId = 5;
using (var t = session.BeginTransaction())
{
Product p1 = new Product();
p1.Name = "Product 1";
session.Save(p1);
Store store = new Store();
store.Name = "Tesco";
session.Save(store);
p1.Stores.Add(store);
store.Products.Add(p1);
session.Save(store);
storeId = store.Id;
t.Commit();
}
using (var t = session.BeginTransaction())
{
Store s = session.Get<Store>(storeId);
Product p = s.Products.FirstOrDefault();
p.Name = "Product 1 Updated";
session.Save(s);
t.Commit(); // <-- Product is still being updated here!
}
session.Flush();
}
答案 0 :(得分:1)
您面临的功能称为change tracking,与级联选项无关。 NHibernate跟踪与会话关联的所有对象,并在提交事务时将所有更改发送到DB。
如果您不需要,可以使用Stateless session来获取未跟踪的实体。但在这种情况下,你不会有延迟加载。您也可以尝试使用FlushMode.Never
以防止NHibernate自动刷新更改为DB