【发布时间】:2017-04-05 13:27:28
【问题描述】:
我有一个表,它在两列 F1 和 Kant[1] 上有一个唯一索引。没有外键,只有主键(一个整数 Id)和这个索引。
在添加新记录之前,我会检查数据库中是否存在具有此索引的记录。[2] 我知道它没有! ExistsLaserData 返回 false。
然后我将记录添加到 DbSet 并执行 SaveChanges 但现在我得到一个异常
DbUpdateException: SqlException: 违反 UNIQUE KEY 约束 'IX_laserdata_F1_Kant'。无法在对象中插入重复键 'dbo.LaserData'。重复键值为 (123456, NULL)。
这是我添加的记录!
上下文被初始化为
LaserDataContext context = new LaserDataContext();
OrderBy(x => x.F1).ThenBy(x => x.Kant).ToList();
我正在使用的两种方法
public bool ExistsLaserData(string article, string kant)
{
bool result = false;
var found = _context.LaserData.Where(x => x.F1 == article && x.Kant == kant).FirstOrDefault();
if (found != null)
{
result = true;
}
return result;
}
public void AddLaserData(ref LaserData d)
{
try
{
_context.LaserData.Add(d);
_context.SaveChanges();
}
catch (Exception ex)
{
throw;
}
}
为什么在我检查时记录不存在,或者为什么在我执行 SaveChanges 时它存在?
[1] 这个数据库的开头是一个 Excel 文档,所以名字很奇怪...
[2] 我不想跳过 ExistLaserData 检查,所以请不要建议我只使用异常。
【问题讨论】:
-
我通常尝试添加返回输入的行数。如果我得到零,则使用更新来更改值。当你有一个主键时,每个唯一 id 在数据表中只允许一行。
-
如果这个系统有可能被多个用户使用并且这些键值是用户提供的,那么 no 量的“预检查”可以让您免于种族,所以你将必须处理异常无论如何。
-
是的,但是我可以像处理异常一样处理它,我会这样做。但这是在添加新记录的对话框中,我想给用户一个“提示”,表明他正在尝试添加已经存在的记录...
标签: c# sql-server entity-framework-6