【问题标题】:DB Concurrency Exception when adding ranges to a list将范围添加到列表时出现数据库并发异常
【发布时间】:2017-12-14 13:39:01
【问题描述】:

我有以下两张表

Datalog | SerialNumber, SignalId (FK), DatalogId
DatalogData | Datetime, Value, DatalogId (FK)

每个 Datalog 可以有多个 DatalogData-Entries。所以 Datalog 表已经填满了值,现在我需要填写 DatalogData 表,这里它失败了,我不知道为什么。整个设置是一个webapi工具

这是一个方法,它采用新的 DatalogData 值并应填写表格

[HttpPost]
[Route("api/logger/{serialNumber}")]
public IHttpActionResult PutLoggerData(string SerialNumber, [FromBody] LogViewModel LogViewModel)
{
    List<Datalog> Datalogs = db.Datalogs.Where(s => s.SerialNumber == SerialNumber).ToList();
    foreach (Datalog dl in Datalogs)
    {
        db.DatalogDatas.AddRange(LogViewModel.GetList(
        LogViewModel.names.IndexOf(dl.Signal.Name)).Select(s => new DatalogData()
        {
            Datetime = s.Item1,
            Value = s.Item2,
            Datalog = dl
        }));
        db.SaveChanges();
    }
    return Ok("ok");
}

LogViewModel 如下所示

public class LogViewModel
{
    public double[][] val;
    public List<string> names;
    public List<double> time;

    public IEnumerable<Tuple<System.DateTime, double>> GetList(int SignalCol)
    {
        List<Tuple<DateTime, double>> Set = new List<Tuple<DateTime, double>>();
        for (int i=0; i<val.Length;i++)
        {
            Set.Add(Tuple.Create(new DateTime(1970, 1, 1, 0, 0, 0, 0, System.DateTimeKind.Utc).AddSeconds(time[i]).ToLocalTime(),
                val[i][SignalCol]));
        }
        return Set;
    }
}

当我调试时,main 方法中的 foreach 循环适用于第一次迭代,第二次给我一个DB Concurrency Exception,我不明白为什么。

更新

也许数据库设计在这里至关重要。 DatalogDatas 不应有任何重复项,因此它没有主键,但在 DatetimeDatalogId 上有一个唯一索引。表 Datalog 在DatalogId 上有一个PK,在SerialNumberSignalId 上有一个唯一索引。

【问题讨论】:

  • 尝试使用 db.SaveChanges();循环之后。
  • 同样的事情,第一次迭代被写了,其他的都没有
  • 第一个代码块中缺少一个“{”,就在方法签名之后。也许你忘记了一部分?
  • 只有我删除的 cmets,没有工作代码。我添加了缺少的 {
  • 我假设您配置了并发令牌?如果有,它们是什么?

标签: c# sql-server asp.net-mvc entity-framework


【解决方案1】:

我发现了错误,其实是两个错误

  1. JSON 数据不正确,这意味着时间向量不知何故损坏了。我从时间戳切换到字符串,现在可以使用了
  2. 由于时间向量具有相同(错误的)值,因此索引忽略了那些 INSERT 命令
  3. 我忘记了 EF 需要主键

感谢大家的努力

【讨论】:

    猜你喜欢
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多