我有以下两个表
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不应该有任何重复项,因此它没有主键,而是Datetime
和DatalogId
上的唯一索引。表Datalog具有DatalogId
上的PK和SerialNumber
以及SignalId
上的唯一索引。
答案 0 :(得分:0)
我发现了错误,实际上是两个错误
INSERT
命令感谢所有的努力