0

我正在使用 NHibernate 3.2,并使用代码映射。

测试用例非常简单——我有一个商店和一个产品,由多对多集合链接。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();
        }
4

1 回答 1

1

您面临的功能称为更改跟踪,与级联选项无关。NHibernate 跟踪与会话关联的所有对象,并在事务提交时将所有更改发送到 DB。

如果您不需要它,您可以使用无状态会话来获取非跟踪实体。但在这种情况下,您不会有延迟加载。您也可以尝试使用FlushMode.Never以防止 NHibernate 自动刷新对 DB 的更改

于 2011-10-11T11:43:16.070 回答