我的映射中有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的所有元素。
答案 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();