数据库并发向列表添加范围时出现异常

时间:2017-12-14 13:39:01

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

我有以下两个表

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和SerialNumber以及SignalId上的唯一索引。

1 个答案:

答案 0 :(得分:0)

我发现了错误,实际上是两个错误

  1. JSON数据不正确,这意味着时间向量以某种方式被破坏了。我从时间戳切换到字符串,现在可以正常工作
  2. 由于时间向量具有相同(错误)值,因此索引忽略了那些INSERT命令
  3. 我忘了EF需要主键
  4. 感谢所有的努力