каскадный тип коллекции в nhibernate - PullRequest
0 голосов
/ 11 октября 2011

Я использую 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);

        },

Если я прав, опция «Каскад» должна позволить вам выбрать, хотите ли вы каскадировать операции над классом, для коллекции.также.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();
        }

1 Ответ

1 голос
/ 11 октября 2011

Функция, с которой вы сталкиваетесь, называется отслеживание изменений и не имеет ничего общего с опциями каскадирования.NHibernate отслеживает все объекты, связанные с сеансом, и отправляет все изменения в БД при фиксации транзакции.

Если вам это не нужно, вы можете использовать сеанс без сохранения состояния , чтобы получить не отслеживаемые объекты.Но в этом случае у вас не будет ленивой загрузки.Также вы можете попробовать использовать FlushMode.Never для предотвращения автоматического сброса NHibernate изменений в DB

...