Nhibernate和自动更新实体的情况

本文关键字:实体 情况 更新 Nhibernate | 更新日期: 2023-09-27 18:20:52

我能想到的最好的标题,不过有点复杂。

// Hit the database once and get all the categories;
IQueryable<Category> qryCategoryList = _repository.Select<Category>();
// get initial parents
var parentCategories = qryCategoryList.Where(x => x.ParentCategoryId == null);
foreach (Category parentCategory in parentCategories)
{
    HttpContext.Current.Response.Write(parentCategory.CategoryName = "This should not happen");
            BuildCategoryList(qryCategoryList, parentCategory.CategoryId);
}

这条线路

 HttpContext.Current.Response.Write(parentCategory.CategoryName = "This should not happen");

执行这个

UPDATE Categories
SET    ParentCategoryId = NULL /* @p0_0 */,
       CategoryName = '->' /* @p1_0 */,
       CategoryDescription = 'The Fruit Category' /* @p2_0 */,
       Active = 1 /* @p3_0 */,
       DateCreated = '2012-01-20T12:03:41.00' /* @p4_0 */,
       LastUpdated = '2012-01-20T12:03:41.00' /* @p5_0 */
WHERE  CategoryId = 'aa8ca9ba-663c-45c8-950b-159a28e6635d' /* @p6_0 */

我不是从我的存储库调用save而不想进行更新。这怎么可能?

编辑:这是地图

 public class CategoryMap : ClassMap<Category>
{
    public CategoryMap()
    {
        Table("Categories");
        LazyLoad();
        Id(x => x.CategoryId).GeneratedBy.GuidComb().Column("CategoryId");
        Map(x => x.ParentCategoryId).Column("ParentCategoryId");
        Map(x => x.CategoryName).Column("CategoryName").Not.Nullable().Length(50);
        Map(x => x.CategoryDescription).Column("CategoryDescription").Not.Nullable();
        Map(x => x.Active).Column("Active").Not.Nullable();
        Map(x => x.DateCreated).Column("DateCreated").Not.Nullable();
        Map(x => x.LastUpdated).Column("LastUpdated").Not.Nullable();
        HasMany(x => x.PostingsCategories).KeyColumn("CategoryId");
    }
}

Nhibernate和自动更新实体的情况

当映射或对象声明中的某些内容与数据库中的内容不太一致时,通常会发生这种情况。例如,数据库中可能有一个UNIQUEIDENTIFIER可以为null,但将其映射到对象上不可为null的Guid。NHibernate选择,看到Guid.Empty而不是null,并说:"嘿!对象变了!Whelp,我想我应该更新它…"

这只是它如何发生的一个例子。如果您发布映射,我们可能会帮助您进一步调试它。

--

事实上,我应该读得更深入一点。如果这在事务范围内,NHibernate将自动更新任何更改的实体,而无需显式调用SaveOrUpdate()。它被称为自动冲洗,默认情况下处于启用状态。如果要显式调用transaction.Commit()session.Flush(),则需要将FlushMode设置为Never