NHibernate:无法将项目附加到地图元素

时间:2010-11-15 13:28:46

标签: nhibernate map mapping

我的映射中有map元素 -

        <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”&amp;运行后SomeTable中的“key2”,如何才能完成?当前nHib在第二次保存之前从SomeTable中删除具有指定id的所有元素。

1 个答案:

答案 0 :(得分:1)

使用此代码,您将创建两个具有相同ID的元素,即主键:这就是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();