4

这是我的错误:

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. 不知何故,教师表有一行引用了用户表中的一行,但该行在用户表中不存在。

知道为什么会这样吗?请指教!

改写我的 Qn:

我知道错误是什么意思,但是我似乎不知道是什么导致了丢失的用户行?我已将其全部放在 Cascade.ALL 上。我认为这与删除无关。以上可能发生的情况有哪些?

编辑2:

请参考 FNH 的映射:这有什么问题吗?

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

谢谢!

4

5 回答 5

4

我将“未找到”属性设置为“忽略”

于 2013-01-21T01:46:53.250 回答
2

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

HasManyToMany(x => x.Bars).Table("foobars")
                        .ParentKeyColumn("FooId")
                        .ChildKeyColumn("Id")
                        .NotFound.Ignore();
于 2015-03-27T10:28:45.150 回答
1

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

于 2012-11-01T13:45:01.973 回答
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);
}
于 2014-11-05T17:35:39.397 回答
0

如果您使用的是.hbm.xml映射文件,则可以将“未找到”设置应用于映射,例如

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

于 2015-04-01T10:40:56.263 回答