NHibernate: не может добавлять элементы в элемент карты - PullRequest
0 голосов
/ 15 ноября 2010

У меня есть элемент карты в моем отображении -

        <component name="Resources">
        <map name="Inner" table="SomeTable" lazy="false" fetch="join" access="field.lowercase-underscore">
            <key column="Id"/>
            <index column="IndexId" type="String"/>
            <composite-element class="SomeResource">
                <property name="Name"/>
            </composite-element>
        </map>
        </component>

Я хочу добавить элементы в SomeTable следующим образом -

            var ent = new Entity();
        ent.Resources.Add("key1", new SomeResource());

        var saved = Session.SaveOrUpdate(ent);
        Session.Session.Flush();
        Session.Session.Clear();

        var newEntity = new Entity {Id = saved.Id};
        ent.Resources.Add("key2", new SomeResource());

        Session.SaveOrUpdate(newEntity);  // here nHib generates DELETE FROM SomeTable WHERE Id = saved.Id
        Session.Session.Flush();
        Session.Session.Clear();

Я хочу иметь элементы "key1" и "key2" в SomeTable после запуска, как это можно сделать? .. В настоящее время nHib удаляет все элементы с указанным идентификатором из SomeTable перед вторым сохранением.

1 Ответ

1 голос
/ 15 ноября 2010

С помощью этого кода вы создаете два элемента с одинаковым идентификатором, то есть первичным ключом: поэтому NHibernate удаляет элемент «key1» (объект ent).

Когда вы создаете newEntity, не задавайте свойство Id (как вы делаете с ent), если вы хотите полностью новый объект. В противном случае, если вы хотите обновить существующий объект, вы делаете:

    var ent = new Entity();
    ent.Resources.Add("key1", new SomeResource());

    var saved = Session.SaveOrUpdate(ent);
    Session.Session.Flush();
    Session.Session.Clear();

    // later...

    var entToUpdate = Session.Get<Entity>(saved.Id);
    ent.Resources.Add("key2", new SomeResource());

    Session.SaveOrUpdate(entToUpdate);
    Session.Session.Flush();
    Session.Session.Clear();
...