NHibernate.ObjectNotFoundException:不存在具有给定标识符的行

时间:2012-11-01 09:53:34

标签: asp.net-mvc-3 nhibernate fluent-nhibernate

这是我的错误:

NHibernate.ObjectNotFoundException: No row with the given identifier exists[Project.Core.Entities.User#(GUID)]
at Hibernate.Impl.SessionFactoryImpl.DefaultEntityNotFoundDelegate.HandleEntityNotFound(String entityName, Object id) 
at NHibernate.Event.Default.DefaultLoadEventListener.Load(LoadEvent event, IEntityPersister persister, EntityKey keyToLoad, LoadType options)

该系统的一个用户偶然发现此错误,这对我来说完全没有意义。我所知道的:

  1. 教师表参考用户表。
  2. 不知何故,Teacher表有一行引用User表中的一行,但该行在User表中不存在。
  3. 知道为什么会这样吗?请指教!

    改述我的Qn:

    我知道这个错误意味着什么,但是我似乎并没有弄清楚是什么导致了错过的用户行?我已将它全部放在Cascade.ALL上。我不认为这与删除有关。上述可能出现的情况有哪些?

    编辑2:

    请参考FNH的映射:有任何问题吗?

    public void Override(AutoMapping<Teacher> mapping)
        {
            mapping.References(x => x.User).Cascade.All().Not.LazyLoad();
        }
    

    谢谢!

5 个答案:

答案 0 :(得分:4)

我将'Not Found'属性设置为'Ignore'

答案 1 :(得分:2)

在Fluent NHibernate for C#中,我使用了

HasManyToMany(x => x.Bars).Table("foobars")
                        .ParentKeyColumn("FooId")
                        .ChildKeyColumn("Id")
                        .NotFound.Ignore();

答案 2 :(得分:1)

我猜你错过了数据库中的FK约束,否则你不会在FK关系上丢失任何记录。在数据库中添加FK和Cascade规则,然后就不会有任何“缺少行异常”。当您尝试执行与数据库模型不一致的操作时,将引发错误。

答案 3 :(得分:0)

试试......

public void Override(ModelMapper modelMapper) {
    modelMapper.Class<T>(c => { 
        c.ManyToOne(m => m.FKObj, r => {
            r.Column("FKColumn");
            r.NotFound(NotFoundMode.Ignore); // THIS IS IMPORTANT!!!
        });
    });
}

或者这......如果您有“约定”文件......

首先处理BeforeMapManyToOne事件:

mapper.BeforeMapManyToOne += Mapper_OnBeforeMapManyToOne;

然后默认将NotFound设置为Ignore ...

private static void Mapper_OnBeforeMapManyToOne(IModelInspector modelInspector, PropertyPath propertyPath, IManyToOneMapper manyToOneMapper) {
    manyToOneMapper.NotFound(NotFoundMode.Ignore);
}

答案 4 :(得分:0)

如果您使用的是.hbm.xml映射文件,那么&#34;未找到&#34;设置可以应用于映射,例如

<many-to-one name="User" column="User" not-found="ignore" />