流畅的NHibernate映射 - 保存子对象

时间:2009-06-24 20:22:53

标签: c# fluent-nhibernate mapping

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

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

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”属性 - 我也不想,因为我正在保存审核,而不是业务。

我应该如何设置映射以实现此目的?

3 个答案:

答案 0 :(得分:0)

问题可能出在商业与评论之间的关键要求上。业务(父母)通常需要在审核(孩子)之前保存。

如果这不起作用,您是否可以包含Business对象的映射?

答案 1 :(得分:0)

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

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

一旦我更新了数据库中的业务表,以便LastModified现在为NOT NULL,它就可以工作。

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

答案 2 :(得分:0)

由于我还没有评论,我会在这里发帖。

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