【问题标题】:Mapping of index-property does not work索引属性的映射不起作用
【发布时间】:2011-12-23 02:16:31
【问题描述】:

我有这个问题:

假设我有一个用户,他是 Cards 的财产:

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正常工作?

【问题讨论】:

  • 当然,这种情况下我可以使用Bag,但是在项目中我有类似的例子。

标签: c# hibernate nhibernate mapping


【解决方案1】:

我使用 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();
        }       
    }
}

但同样,为了使其正常工作,您的映射应该明确定义。

【讨论】:

  • Fluent 很好,但现在完全在他的移动或在我不想要的项目中弄得一团糟。但无论如何感谢您的帮助。
  • 我使用 Fluent NHibernate,所以我用它作为分享我知识的媒介。映射的思路其实是一样的,在运行时(不知道是运行时还是编译时),生成的Sql会完全一样。
  • 我明白这一点,我只是想找出我做错了什么。也许我缺少一些属性?
猜你喜欢
  • 2023-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多