【问题标题】:Fluent NHibernate Mapping - Saving Child object流畅的 NHibernate 映射 - 保存子对象
【发布时间】:2009-06-26 21:26:55
【问题描述】:

我认为,我在 Fluent NHibernate 映射方面遇到了问题,并且无法完全理解我应该如何设置映射以避免问题。

我有一个业务对象(字面意思是“业务”)和一个评论对象。每个企业都可以在 UI 的一个页面上创建多个评论。该业务是评论的财产,如下所示:

public class Business 
{
    public virtual int BusinessId {get;set;}
    public virtual DateTime LastModified {get;set;}
    public virtual IList<Review> Reviews {get;set;}

    [... more removed for brevity ...]

}

public class Review
{
    public virtual int ReviewId {get;set;}
    public virtual string ReviewText {get;set;}
    public virtual Business Business {get;set;}

    [... more removed for brevity ...]

}

我的映射如下:

public class ReviewMap : ClassMap<Review>
{
    public ReviewMap()
    {
        WithTable("Reviews");
        Id(x => x.ReviewId).TheColumnNameIs("ReviewId").GeneratedBy.Identity();

        References(x => x.Business).TheColumnNameIs("BusinessId");

        Map(x => x.ReviewText);

       [... and so on...]
}


public class BusinessMap : ClassMap<Business>
{
    public BusinessMap()
    {
        WithTable("Businesses");

        Id(x => x.BusinessId).TheColumnNameIs("BusinessId").GeneratedBy.Identity();

        Map(x => x.Name).TheColumnNameIs("BusinessName");
        Map(x => x.LastModified, "LastModifiedOn");

        HasMany<Review>(x => x.Reviews)
            .Inverse()
            .LazyLoad();

        [... more removed for brevity ...]

    }
}

仓库代码是

public void Save(T entity)
    {
        using (ISession session = GetSession())
        using (ITransaction tx = session.BeginTransaction())
        {
            session.SaveOrUpdate(entity);
            tx.Commit();
        }
    }

在代码中,我将属性分配给 Review 对象,并调用 Repository 的 Save 方法。

问题在于,由于我没有更新业务本身,我不希望它被保存——我想要的只是保存评论。但是代码也试图保存业务,我得到一个例外,因为我没有设置“LastModified”属性——我也不想,因为我保存的是审查,而不是业务。

我应该如何设置映射以让这种情况发生?

【问题讨论】:

    标签: c# fluent-nhibernate mapping


    【解决方案1】:

    问题可能来自业务和审核之间的外键要求。通常需要先保存商家(父),然后才能进行评论(子)。

    如果这没有帮助,您能否包括您的业务对象的映射?

    【讨论】:

    • 好吧,业务已经存在——我不希望保存它,因为它有点独立于审查——无论如何,一旦我有了 ID。我的意思是:我为什么要保存一个我没有改变的对象?
    • 那么,如果保存了业务,你怎么会得到一个错误,说 LastModified 属性没有设置?您如何分配 Review.Business 属性值?
    【解决方案2】:

    好的,问题是这样的:Business 的 LastModified 属性实际上并未在实际的业务对象中设置,因为数据库允许该属性为 NULL。

    这意味着当我试图保存评论时,它也试图保存业务——很可能是因为它认识到数据库对象没有 LastModified 的值(null),但默认情况下,因为 LastModified 是一个 DateTime,其值为 DateTime.MinValue。

    一旦我更新了数据库中的业务表,使得 LastModified 现在不是 NULL,它就可以工作了。

    不幸的是,我正在处理的数据进入了这种状态,而这不是问题。

    【讨论】:

    • 如果这回答了你的问题,你应该接受这个作为答案。
    • 抱歉,拖了这么久——我不得不等待接受我自己的答案,老实说......忘了回来修复它!
    【解决方案3】:

    由于我还不能发表评论,所以我会在这里发布。

    如果您确实希望 LastModified 列可以为空,则相应的属性应该是 DateTime? 而不是普通的 DateTime

    【讨论】:

    • Dave 在这里是正确的,如果您的整个问题只是 DateTime 需要为空...您应该使用 DateTime?而不是将 DateTime 设置为 DateTime.Min.
    猜你喜欢
    • 2013-11-14
    • 1970-01-01
    • 2015-11-22
    • 2023-03-14
    • 2010-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多