Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/257.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.AssertionFailure:空标识符_C#_Nhibernate_Fluent Nhibernate_Fluent Nhibernate Mapping - Fatal编程技术网

C# NHibernate.AssertionFailure:空标识符

C# NHibernate.AssertionFailure:空标识符,c#,nhibernate,fluent-nhibernate,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Fluent Nhibernate Mapping,在我把我的电脑放到下周之前 关于这一点,我已经检查了所有其他问题,但没有一个有解决方案。我已经删除了这段代码,但它仍然不起作用 保存对象时出现此错误:NHibernate.AssertionFailure:null标识符 这是我的映射文件: public class OrderMap : BaseMap<Order> { public SalesOrderMap() { Id(x => x.Id).Column("OrderId"); }

在我把我的电脑放到下周之前

关于这一点,我已经检查了所有其他问题,但没有一个有解决方案。我已经删除了这段代码,但它仍然不起作用

保存对象时出现此错误:NHibernate.AssertionFailure:null标识符

这是我的映射文件:

public class OrderMap : BaseMap<Order>
{
    public SalesOrderMap()
    {
        Id(x => x.Id).Column("OrderId");
    }
}
这是我的测试代码:

Order order = new Order();
ISession session = SessionFactory.GetCurrentSession();
session.SaveOrUpdate(order); <----EXCEPTION ON THIS LINE
session.Flush();
如果有人感兴趣,以下是会话工厂的构建方式:

ControllerSource.SessionFactory = Fluently.Configure()
                .Database(MsSqlConfiguration.MsSql2008.ConnectionString(DataConfig.ConnectionString))
                .Mappings(x => x.FluentMappings.Add(typeof (OrderMap)))
                .ExposeConfiguration(c =>{
                                             c.SetProperty("generate_statistics", "false");
                                             c.SetProperty("current_session_context_class", contextClass);
                                             c.SetProperty("cache.use_second_level_cache", "false");
                                             c.SetProperty("cache.use_query_cache", "false");
                                             c.SetProperty("connection.release_mode", "on_close");
                })
                .BuildSessionFactory();

您需要在尝试创建新实体时为实体分配一个id,或者指定如何在映射文件中生成该id。将映射更改为:

Id(x => x.Id).Column("OrderId").GeneratedBy.Identity();

默认生成器是本机生成器,它将反过来使用SQL Server 2008的标识。我敢打赌,您没有在表定义的列上指定标识。

检查您的表没有干扰插入的触发器,或者可能在插入时调用存储过程

当NHibernate插入实体时,它将向数据库请求自动生成的新实体的主键

INSERT INTO [Order] (MyProperty) VALUES (@p0); select SCOPE_IDENTITY()
请注意选择作用域标识()调用

如果SCOPE_IDENTITY返回NULL,那么您将得到NHibernate.AssertionFailure:NULL标识符异常

例如,“代替插入”触发器将使SCOPE_IDENTITY返回null,并触发NHibernate断言

如果发现触发器干扰,可以通过临时禁用它来排除是否是实际问题。从长远来看,如果不再需要触发器,您可以决定是否完全取消触发器


或者,您可以将插入内容包装到事务中;然后在插入之前禁用触发器,执行实体的实际保存/插入,然后重新启用触发器并提交事务。

您可以发布订单表的创建脚本吗?它当前只是一个表,字段为in,auto increment,int,不可为null(我想我有点像个傻瓜……)展示你的SessionFactory.GetCurrentSession在我的类似案例中,这篇文章很有帮助[AssertionFailure:“空标识符”-FluentNH+SQLServerCE][1][1]:我相信“身份”是该值的默认值…不幸的是,没有work@Paul-从orderid属性中的集合中删除“protected”,说明正确。有人应该接受这个答案。即使你不在办公室,你也能帮上忙,大卫!
Id(x => x.Id).Column("OrderId").GeneratedBy.Identity();
INSERT INTO [Order] (MyProperty) VALUES (@p0); select SCOPE_IDENTITY()