C# 为什么添加这条线会弄乱我的NHibernate映射?

C# 为什么添加这条线会弄乱我的NHibernate映射?,c#,nhibernate,C#,Nhibernate,我有一个非常简单的类图 public class ContentMap : ClassMap<Content> { public ContentMap() { // Basic property mapping // Parent property mapping References(x => x.Category).Column("CategoryId"); } } 我的映射出错了 如果lastActiv

我有一个非常简单的类图

public class ContentMap : ClassMap<Content>
{
    public ContentMap()
    {
       // Basic property mapping

       // Parent property mapping
       References(x => x.Category).Column("CategoryId");
    }
}
我的映射出错了

如果
lastActiveSubcategory ID
为空,
Category
映射良好。如果不为空,则将设置
LastActiveSubCategoryId
,但
CategoryId
为空

实际属性本身很简单

public virtual Category Category { get; set; }

public virtual SubCategory LastActive { get; set; }
类别
子类别
映射中也没有复杂的内容。它们看起来非常类似于
ContentMap
类(只有一条参考线)

知道什么会导致这种行为吗?我只能使用一个参考资料吗

更新

我已经研究了SQL,这似乎是正在发生的事情,希望有人能帮助我理解为什么

Content
实体插入数据库时,使用
CategoryId
LastActiveSubCategoryId
null即可

插入
类别
实体,然后更新语句更新
内容
,只更新
类别ID
字段,而不更新其他内容

如果没有
子类别
,此时一切都会很好

如果存在
子类别
,则会在插入一些语句后更新
类别
。在update语句中,有几个不同的值正在被修改(一些值不需要修改,因为它们自插入后没有更改),包括
CategoryId
SubCategoryId
。除此之外,
CategoryId
为空,
LastActiveSubCategoryId
不为空

那么为什么
CategoryId
在更新时为空呢

更新2

我用于实际插入对象的代码仅用于一些基本测试。这些是相关的代码位:

Category category = new Category();
dao.Save(category);

Content content = new Content();
category.AddContent(content); // Adds it to a list, like in the tutorial mBotros posted
dao.Save(Content);

SubCategory subCategory = new SubCategory();
content.AddSubCategory(subCategory);
dao.Save(subCategory);

// On the Content class
public virtual void AddSubCategory(SubCategory subCategory)
{
   SubCategories.Add(subCategory);
   LastActive = subCategory;
}

您提到的
LastActiveId
不在您显示的代码中

您是否碰巧尝试将列映射为引用和标量属性


更新:您的代码片段仍然不完整,或者您缺少将导致更新发生的事务/刷新。另外,您是否同时拥有名为SubCategories的集合(未显示)和名为LastActive的属性?

数据库架构中有一个循环引用,这会使插入行变得棘手。
内容
引用
子类别
,以及
子类别
引用
内容
。如果尝试使用普通的旧SQL插入行,则无法执行以下操作:

/* this line does not work because SubCategory 2 does not exist yet */
insert into Content (Id, LastActiveSubCategoryId) values (1, 2);
insert into SubCategory (Id, ContentId) values (2, 1);
相反,您必须执行以下操作:

insert into Content (Id, LastActiveSubCategoryId) values (1, null);
insert into SubCategory (Id, ContentId) values (2, 1);
update Content set LastActiveSubCategoryId = 2 where Id = 1;
当你坚持你的NHibernate实体时,你需要记住这一点。将
AddSubCategory
修改为不设置
LastActive
。首先保存两个实体,然后关闭循环

// ... code to save Category and Content, then...

SubCategory subCategory = new SubCategory();
content.AddSubCategory(subCategory); // modified to *not* set LastActive
dao.Save(subCategory);

content.LastActive = subCategory;
dao.Update(content);

不,对不起。我的意思是
lastactivesubcategorid
@Brandon:请发布您的实际代码(即最小的复制片段),我已更新了问题,并尝试只保留重要的部分。我希望此链接有助于将代码发布到您创建的位置,并将对象插入数据库中。
// ... code to save Category and Content, then...

SubCategory subCategory = new SubCategory();
content.AddSubCategory(subCategory); // modified to *not* set LastActive
dao.Save(subCategory);

content.LastActive = subCategory;
dao.Update(content);