加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 为什么我的类将一个集合保存到数据库而不保存另一个集合?

发布时间:2020-12-15 21:31:24 所属栏目:百科 来源:网络整理
导读:这真让我抓狂.我可以将其中一个集合保存在一个类中,但不能保存在另一个类中. 我有一个名为Category的类 public Category(){ Items = new ListItem(); Prices = new ListPrice();} 这两种方法几乎完全相同.构造函数分别设置一个名为Category的属性及其Name和P
这真让我抓狂.我可以将其中一个集合保存在一个类中,但不能保存在另一个类中.

我有一个名为Category的类

public Category()
{
    Items = new List<Item>();
    Prices = new List<Price>();
}

这两种方法几乎完全相同.构造函数分别设置一个名为Category的属性及其Name和Price.

public virtual Item AddItem(string name)
{
    var item = new Item(this,name);
    Items.Add(item);
    return item;
}

public virtual Price AddPrice(decimal price)
{
    var price = new Price(this,price);
    Prices.Add(price);
    return price;
}

映射

public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
       // Other properties

       HasMany(x=>x.Items).Cascade.AllDeleteOrphan();
       HasMany(x=>x.Prices).Cascade.AllDeleteOrphan();
    }
}

如您所见,两个集合的映射方式完全相同.

Price和Item的映射都具有相同的映射

References(x=>x.Category);

据我所知,几乎关于这两者的一切都是相同的.这是问题所在

category.AddItem(someName);
session.Save(category);    // Works

category.AddPrice(somePrice);
session.Save(category);    // Doesn't work

它们位于我用来填充测试数据库的文件中.保存项目工作正常.保存价格没有.类和映射是相同的.我无法弄清楚.

映射应该可以正常工作,因为调用构造函数直接工作正常

session.Save(new Price(category,1));

那么为什么Category保存一个集合而不另一个?我运行了探查器,该类甚至没有尝试保存Price集合.

更新:

正如Gabe在评论中指出的那样,如果我交换调用以便在Item之前调用Price,则Price进入数据库而Item不进入.

如果我在每次收集更新后调用session.Flush(),它都可以正常工作.我应该这样做,还是有办法修复我的映射,以便它的工作原理?

解决方法

尝试交换调用的顺序(首先添加价格,然后添加项目)以查看价格映射是否确实存在问题,或者问题是第二次调用失败.

关于flush – 大多数情况下你不需要显式调用flush,这是nHibernate在需要时(details here)在后台执行的操作.刷新模式不是映射问题(它是您可以设置的会话属性,但通常您不必这样做).

如果要在事务中包装代码,则不需要刷新.如果你不是,你应该是,这可能是你的问题.

using (var tx = Session.BeginTransaction()) {

    category.AddItem(someName);
    category.AddPrice(somePrice);
    session.Save(category);

    tx.Commit();
}

更新:我想我知道你的问题是什么.鉴于您的代码,看起来您正在创建一个新的类别对象并用数据填充它.在第一个Save()上,nHibernate执行自动刷新,因为它不能将category_id分配给子集合,直到它从db获取一个.但第二次,类别有一个id,所以会话不需要立即刷新.当不需要时,nHibernate对数据库不熟悉.正如我上面提到的,解决方案是始终使用事务来指定何时完成您的工作.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读