マッピング: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; }
}
ユニットテスト:
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();
nHibによって生成された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は、親が保存された後、子が複合IDを更新しないため、子を保存しようとして失敗するという問題があります。なぜ??これらのIDを更新するにはどうすればよいですか?また、Merge()の代わりにSaveOrUpdate()を使用すると、うまく動作します。しかし、私はマージを使用する必要があります。助けてください!