我有这个问题:
假设我有一个用户,他是卡的财产:
public class User: Entity
{
...
public virtual IList<Card> Cards { get; set; }
...
}
<class name="User" table="Users">
<id name="Id" column="UserId">
<generator class="guid"/>
</id>
<version name="Version"/>
...
<list name="Cards" cascade="all" inverse="true">
<key column="ViolatorId" not-null="true"/>
<index column="CardIndex"/>
<one-to-many class="Card"/>
</list>
...
</class>
然后我从数据库中获取用户,将其添加到卡片列表中,然后调用session.Update()。
生成此sql代码:
INSERT INTO Cards
(Version,
ViolatorId,
ModeratorId,
IssueDate,
TermDate,
Cause,
Type,
CardId)
VALUES (1 /* @p0_0 */,
'6872df65-a1d7-40ef-abec-c14af96f3388' /* @p1_0 */,
'06060a30-252a-4f29-84fe-af5da110f049' /* @p2_0 */,
'2011-11-06T17:20:11.00' /* @p3_0 */,
'2011-11-06T22:20:11.00' /* @p4_0 */,
'Ad personam' /* @p5_0 */,
'Red' /* @p6_0 */,
'0454bbba-5ec9-429f-8830-d9cc33588f7a' /* @p7_0 */)
问题是,请求不包含CardIndex的值,并将其作为NULL填入数据库。
如何让NHibernate正常工作?
答案 0 :(得分:0)
我使用Fluent NHibernate映射来定义实体映射。在您的情况下,用户和卡实体之间存在一对多关系。要使级联保存/更新/删除正常工作,您必须在两个实体之间定义正确的两个映射。此外,Cards实体应该具有对Users实体的引用。请参阅以下链接,了解如何使用Fluent NHibernate定义此类映射(在C#中):
http://wiki.fluentnhibernate.org/Fluent_mapping#HasMany_.2F_one-to-many http://wiki.fluentnhibernate.org/Fluent_mapping#References_.2F_many-to-one
虽然代码是用C#给出的,但我认为你不应该很难理解为什么会这样。
您还可以尝试以下方法来实现级联保存父子关系类型的实体。
public void Test()
{
using (IStatelessSession statelessSession = _sessionManager.OpenStatelessSession())
{
using (ITransaction transaction = statelessSession.BeginTransaction())
{
statelessSession.Insert(<ParentEntity>);
foreach(var childEntity in ParentEntity)
{
statelessSession.Insert(<childEntity>);
}
transaction.Commit();
}
}
}
但是,为了使其正常工作,您的映射应该明确定义。