映射:NHibernate的:使用合并时不更新子复合-ID()
<class name="PhoneTypeTest" lazy="false" table="PhoneType">
<cache usage="read-write"/>
<id name ="Id" type="Int32" unsaved-value="0">
<generator class="identity"/>
</id>
<bag name="Resources" table="PhoneTypeResource" lazy="false" cascade="all" inverse="true">
<key column="PhoneTypeId" />
<one-to-many class="PhoneTypeTestResource" not-found="ignore"/>
</bag>
</class>
<class name="PhoneTypeTestResource" lazy="false" table="PhoneTypeResource">
<composite-id class="CCCC.ResourcesCompositeKey, DDDD" name="Id">
<key-property name="OwnerId" column="PhoneTypeId"/>
<key-property name="CultureId"/>
</composite-id>
<property name="Name"/>
</class>
实体:
public class PhoneTypeTest
{
public PhoneTypeTest()
{
Resources = new List<PhoneTypeTestResource>();
}
public virtual int Id { get; set; }
public virtual IList<PhoneTypeTestResource> Resources { get; set; }
}
public class PhoneTypeTestResource
{
public virtual ResourcesCompositeKey Id { get; set; }
public virtual string Name { get; set; }
}
单元测试:通过nHib产生
var ent = new PhoneTypeTest();
ent.Resources.Add(new PhoneTypeTestResource { Id = new ResourcesCompositeKey { CultureId = En, OwnerId = 0 }, Name = "Name" });
Session.Merge(ent);
Session.Flush();
Session.Clear();
SQL:
-- statement #1
INSERT INTO PhoneType
DEFAULT VALUES
select SCOPE_IDENTITY()
-- statement #2
SELECT phonetypet0_.PhoneTypeId as PhoneTyp1_61_0_,
phonetypet0_.CultureId as CultureId61_0_,
phonetypet0_.Name as Name61_0_
FROM PhoneTypeResource phonetypet0_
WHERE phonetypet0_.PhoneTypeId = 0 /* @p0 */
and phonetypet0_.CultureId = 'en' /* @p1 */
-- statement #3
INSERT INTO PhoneTypeResource
(Name,
PhoneTypeId,
CultureId)
VALUES ('Name' /* @p0 */,
0 /* @p1 */,
'en' /* @p2 */)
-- statement #4
ERROR:
Could not synchronize database state with session
因此,正如你所看到的,问题是nHib在父节点保存后不会更新子节点,并且保存子节点的尝试失败。为什么??我如何让nHib更新这些ID?另外,如果我使用SaveOrUpdate()而不是Merge(),它可以正常工作!但我必须使用合并。请帮忙!