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);