Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# NHibernate中本机生成的值类型标识符是否可以为null?_C#_Nhibernate_Fluent Nhibernate - Fatal编程技术网

C# NHibernate中本机生成的值类型标识符是否可以为null?

C# NHibernate中本机生成的值类型标识符是否可以为null?,c#,nhibernate,fluent-nhibernate,C#,Nhibernate,Fluent Nhibernate,我有一个NHibernate映射,它位于一个单一的、遗留的数据库之上,自从我们在生产中推出以来,我们偶尔会从NHibernate获得错误,每天大约4-8次,每天处理大约60000个事件,因此错误频率约为0.006%-0.013%) 据我和我的同事所知,这些失败的事件/消息与成功的事件/消息没有什么不同 我们得到的错误是 NHibernate.AssertionFailure: null identifier at NHibernate.Engine.EntityKey..ctor(Object

我有一个NHibernate映射,它位于一个单一的、遗留的数据库之上,自从我们在生产中推出以来,我们偶尔会从NHibernate获得错误,每天大约4-8次,每天处理大约60000个事件,因此错误频率约为0.006%-0.013%)

据我和我的同事所知,这些失败的事件/消息与成功的事件/消息没有什么不同

我们得到的错误是

NHibernate.AssertionFailure: null identifier
at NHibernate.Engine.EntityKey..ctor(Object identifier, String rootEntityName, String entityName, IType identifierType, Boolean batchLoadable, ISessionFactoryImplementor factory, EntityMode entityMode)
at NHibernate.Engine.EntityKey..ctor(Object id, IEntityPersister persister, EntityMode entityMode)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSaveOrReplicate(Object entity, EntityKey key, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.PerformSave(Object entity, Object id, IEntityPersister persister, Boolean useIdentityColumn, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.AbstractSaveEventListener.SaveWithGeneratedId(Object entity, String entityName, Object anything, IEventSource source, Boolean requiresImmediateIdAccess)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.SaveWithGeneratedOrRequestedId(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.EntityIsTransient(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveEventListener.PerformSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Event.Default.DefaultSaveOrUpdateEventListener.OnSaveOrUpdate(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.FireSave(SaveOrUpdateEvent event)
at NHibernate.Impl.SessionImpl.Save(Object obj)
但是标识符列是一个值类型(System.Int32),使用本机生成器。 它怎么可能是空的

public class MyItem {
   public int MyItemId { get; set; }
}

public class MyItemMap : ClassMapping<MyItem>
{
    public MyItemMap ()
    {
        Table("MyItemTable");

        Id(m => m.MyItemId, x =>
        {
            x.Column("MyItem_ID");
            x.Generator(Generators.Native);
            x.UnsavedValue(default(int));
        });
    }
}
公共类MyItem{
公共int MyItemId{get;set;}
}
公共类MyItemMap:类映射
{
公共MyItemMap()
{
表(“MyItemTable”);
Id(m=>m.MyItemId,x=>
{
x、 列(“MyItem_ID”);
x、 生成器(Generators.Native);
x、 未保存的值(默认值(int));
});
}
}
所以我的问题是,; a) 当标识符是值类型(即不可为空)时,为什么NHibernate会抱怨空标识符?
b) 对此我能做些什么吗?

我能够分离并重现这个问题

有问题的表(MyItemTable)的索引的IGNORE\u DUP\u KEY=ON

由于另一个问题,我们尝试插入两个几乎相同的行。 第二次插入失败时会出现警告,并且没有实际插入任何行。 因此,当NHibernate尝试获取生成的标识时,SQL Server可能会返回NULL,因为没有插入任何记录

这在任何测试中都没有首先出现的原因是,数据库从一开始就没有通过工具进行版本控制,而是通过手动迁移进行版本控制。此外,当我们的db版本控制工具为遗留数据库编写脚本时,索引也不包括在内。 因此,为集成测试生成的测试环境/数据库中缺少索引。
单片遗留内容的头痛问题…

您使用什么样的数据库,本机生成器选择什么?以及NHibernate的哪个版本?您可以查看/发布NHibernate生成的insert语句吗?MichaC,MSSQL 2008,该列为“int IDENTITY”。Daniel,NHibernate版本3.3.2.4000I将设置Log4Net并运行一天,以捕获所有错误。