【发布时间】: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 不应有任何重复项,因此它没有主键,但在 Datetime 和 DatalogId 上有一个唯一索引。表 Datalog 在DatalogId 上有一个PK,在SerialNumber 和SignalId 上有一个唯一索引。
【问题讨论】:
-
尝试使用 db.SaveChanges();循环之后。
-
同样的事情,第一次迭代被写了,其他的都没有
-
第一个代码块中缺少一个“{”,就在方法签名之后。也许你忘记了一部分?
-
只有我删除的 cmets,没有工作代码。我添加了缺少的 {
-
我假设您配置了并发令牌?如果有,它们是什么?
标签: c# sql-server asp.net-mvc entity-framework