Bhu*_*kla 2 asp.net nhibernate asp.net-mvc
使用NHibernate在数据库中插入新记录时出现以下错误.
{"Batch update returned unexpected row count from update; actual row count: 0; expected: 1"}
我有两个主要和外国关系的表.我想插入两个表中的记录:这里是映射类
DemoStudentMap.cs
public DemoStudentMap() {
Table("DEMO_Student");
Id(t => t.StudentId).Column("StudentId").GeneratedBy.Identity();
Map(t => t.Name, "Name");
Map(t => t.Class, "Class");
Map(t => t.Board, "Board");
Map(t => t.Enabled, "Enabled");
Map(t => t.Isdeleted).Column("IsDeleted");
Map(t => t.Createddate).Column("CreatedDate");
Map(t => t.Lastmodifyby).Column("LastModifyBy").Nullable();
Map(t => t.Lastmodifieddate).Column("LastModifiedDate").Nullable();
References(x => x.DemoScore).ForeignKey("RollNumber");
}
Run Code Online (Sandbox Code Playgroud)
DemoScoreMap.cs
public DemoScoreMap() {
Table("DEMO_Score");
Id(t => t.rollnumber).Column("RollNumber");
Map(t => t.math, "Math");
Map(t => t.physics, "Physics");
Map(t => t.english, "English");
Map(t => t.enabled, "Enabled");
Map(t => t.isdeleted).Column("IsDeleted");
Map(t => t.createddate).Column("CreatedDate");
Map(t => t.lastmodifyby).Column("LastModifyBy").Nullable();
Map(t => t.lastmodifieddate).Column("LastModifiedDate").Nullable();
}
Run Code Online (Sandbox Code Playgroud)
我使用的是Asp.net WebAPI.在Api控制器的Post方法中,我检索了要插入的值.这是我的ApiController:
DemoScoreViewModel newScore = new DemoScoreViewModel();
DemoScore score = newScore.ConvertDemoScoreViewModelToDemoS(newStudent, _crudStatusCreate);
bool resultScore = _demoScoreTask.Create(score);
DemoStudent student = newStudent.ConvertDemoStudentViewModelToDemoStudent(newStudent, score, _crudStatusCreate);
bool result = _demoStudentTask.Create(student);
Run Code Online (Sandbox Code Playgroud)
在这里,我得到了"score"和"student"变量中的值,我希望将其保存在数据库中.我有以下创建新记录的方法,返回bool结果,如代码所示.
但是在保存数据的时候我得到了上面提到的错误.这是我插入的代码.我得分和学生都有同样的错误.这是我的创建代码:
对于学生:
public bool Create(DemoStudent newStudent)
{
try
{
_demoStudentRepo.DbContext.BeginTransaction();
_demoStudentRepo.SaveOrUpdate(newStudent);
_demoStudentRepo.DbContext.CommitTransaction();
}
catch
{
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
前评分
public bool Create(DemoScore newScore)
{
try
{
_demoScoreRepo.DbContext.BeginTransaction();
_demoScoreRepo.SaveOrUpdate(newScore);
_demoScoreRepo.DbContext.CommitTransaction();
}
catch
{
return false;
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
注意:当我删除事务时,我没有收到此错误,但仍然没有保存我的数据.
这里的问题隐藏在一个事实中,即SaveOrUpdate()所谓的。NHibernate由于某些原因(稍后讨论)决定调用“ UPDATE”。但是因为我们正在创建新实例,所以更新的行数...为0。预期为1
可能是什么原因?那DemoScore还是DemosStudent确实有默认的incnosistency ID值,UnsavedValue设置。
即NHibernate期望Id == 0表示新...而其他任何值(甚至是负数)都将被视为现有实体...应更新。
因此,请检查为ID中的ID分配了什么值 _demoScoreTask.Create(score);
可以在映射中调整默认设置(0表示新设置),例如.UnsavedValue(-1)
注意:之所以没有事务的版本没有引发异常,是因为未调用Flush()。请检查9.6。冲洗。例如,我们可以将:更改sess.FlushMode = FlushMode.Commit;为“ 自动 ”,但是“提交”是合适的。
小智 5
就我而言,它是身份密钥.它缺少.GeneratedBy逻辑.
Run Code Online (Sandbox Code Playgroud)Table("JobDetailsBlob"); Id(x => x.Id, "JobDetailId");
变成
Run Code Online (Sandbox Code Playgroud)Table("JobDetailsBlob"); Id(x => x.Id, "JobDetailId").GeneratedBy.Assigned();
因为它显然无法正确创建标识列.所以这是一个映射问题.希望它可以帮助.