C# 无法将多个项目插入SQLite数据库

C# 无法将多个项目插入SQLite数据库,c#,linq,sqlite,C#,Linq,Sqlite,DB有一个用于批次数据的主表,每个批次可以有零个或多个样本。它们链接在Batch.BatchID==Samples.FK\u BatchID上。这些表格的类别如下所示 我可以为批次添加一个值-自动增量BatchID会按预期更新。 我可以为样本添加一个值。 我无法将多个值添加到Samples表中,并获得异常 其他信息:无法添加密钥已在使用的实体 如果我将STOP设置为“1”,那么db将获得一个新批,其中包含一个正确引用的新样本。我必须做什么才能允许为一个批次添加多个样品。此外,理想情况下,我希望使

DB有一个用于批次数据的主表,每个批次可以有零个或多个样本。它们链接在Batch.BatchID==Samples.FK\u BatchID上。这些表格的类别如下所示

我可以为批次添加一个值-自动增量BatchID会按预期更新。 我可以为样本添加一个值。 我无法将多个值添加到Samples表中,并获得异常

其他信息:无法添加密钥已在使用的实体

如果我将STOP设置为“1”,那么db将获得一个新批,其中包含一个正确引用的新样本。我必须做什么才能允许为一个批次添加多个样品。此外,理想情况下,我希望使用相同的上下文和单个“SubmitChanges()”操作,但在运行之前先让我走一走

以下是我尝试的代码:

 Int64 newbatchID = 0;
 using (var context = new Data.BatchContext(connection))
 {    // This 'chunk' work fine and the newbatchID gets the new value
      context.Log = Console.Out;
      Data.Batches newBatch = new Data.Batches {
           Created = System.DateTime.Now.ToString("u"),
           Title = "New Title",
           Varietal = "Waltz"
      };

      // Return the Batch Id if necessary...
      var qs = from c in context.sqlite_sequence
               where c.name == "Batches"
               select c.seq;
      context.Batches.InsertOnSubmit(newBatch);
      context.SubmitChanges();
      newbatchID = qs.ToList().First();
 }

 // Use the new batch ID to submit a load of new samples
 int STOP = 2;     // PROBLEM. If Stop is not 1 the following fails
 using (var context = new Data.BatchContext(connection))
 {
      context.Log = Console.Out;
      List<Data.Samples> samplelist = new List<Data.Samples>();
      for (var i = 0; i < STOP; ++i)
      {    // Just to get different time values
           System.Threading.Thread.Sleep(500);
           samplelist.Add(
                new Data.Samples {
                     // Commenting out the FK_BatchID doesn't help
                     FK_BatchID = newbatchID,
                     Created = System.DateTime.Now.ToString("u"),
                     ImageURI = String.Format("./Path/Img_{0}.jpg", i)
                });
           }
           context.Samples.InsertAllOnSubmit(samplelist);
           context.SubmitChanges();
      }

如果没有更好的解决方案,那么我会接受这个答案,因为没有合适的解决方案,这里是我的解决方法

使用sql_序列建立自动增量Id值,然后在创建的对象中显式使用这些值

var aiQuery = (from sequence in sqlite_sequence
               select sequence).ToList();

BatchId = 1 + aiQuery.Find(q => q.name == @"Batches").seq;
SampleId = 1 + aiQuery.Find(q => q.name == @"Samples").seq;
为了方便起见,我将其放在从Linq.DataContext派生的类中


然后,可以按照以下伪代码在单个事务中添加多个插入

Batch batch = new Batch { id = BatchId, ... }
foreach (int i=0; i<n; ++i)
{
   batch.AddSample(new Sample { id = SampleId+i, batchid = BatchId, ... });
}

// Update db
context.Batches.InsertOnSubmit(batch);
context.SubmitChanges();
Batch Batch=新批{id=BatchId,…}

foreach(inti=0;i在缺乏适当解决方案的情况下,这里是我的解决方法

使用sql_序列建立自动增量Id值,然后在创建的对象中显式使用这些值

var aiQuery = (from sequence in sqlite_sequence
               select sequence).ToList();

BatchId = 1 + aiQuery.Find(q => q.name == @"Batches").seq;
SampleId = 1 + aiQuery.Find(q => q.name == @"Samples").seq;
为了方便起见,我将其放在从Linq.DataContext派生的类中


然后,可以按照以下伪代码在单个事务中添加多个插入

Batch batch = new Batch { id = BatchId, ... }
foreach (int i=0; i<n; ++i)
{
   batch.AddSample(new Sample { id = SampleId+i, batchid = BatchId, ... });
}

// Update db
context.Batches.InsertOnSubmit(batch);
context.SubmitChanges();
Batch Batch=新批{id=BatchId,…}

弗雷奇(int i=0;我没有
Batch
可以添加新样本的
Samples
集合?@Gert:Yes,使用sqlite_序列的黑客用法允许在单个事务中添加包含多个样本的新批。
Batch
没有可以添加新样本的
Samples
集合吗?@Gert:Yes,通过使用sqlite_序列,可以在单个事务中添加具有多个样本的新批处理。