我认为,我遇到了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”属性 - 我也不想,因为我正在保存审核,而不是业务。
我应该如何设置映射以实现此目的?
答案 0 :(得分:0)
问题可能出在商业与评论之间的关键要求上。业务(父母)通常需要在审核(孩子)之前保存。
如果这不起作用,您是否可以包含Business对象的映射?
答案 1 :(得分:0)
好的,问题是这样的:Business的LastModified属性实际上并没有在实际的业务对象中设置,因为数据库允许此属性为NULL。
这意味着当我尝试保存审核时,它还尝试保存业务 - 很可能是因为它认识到数据库对象没有LastModified的值(null),但默认情况下,因为LastModified是一个DateTime,它的值是DateTime.MinValue。
一旦我更新了数据库中的业务表,以便LastModified现在为NOT NULL,它就可以工作。
不幸的是,我正在处理的数据进入这个状态而没有这个问题。
答案 2 :(得分:0)
由于我还没有评论,我会在这里发帖。
如果您确实希望LastModified列可以为空,则相应的属性应该是DateTime?
而不是普通的DateTime
。