Вы можете обойти эту проблему, создав новый экземпляр DataContext для каждой операции вставки.
var db = new DataClasses1DataContext(@"Data Source=");
var testTableRecord1 = new testTable();
db.GetTable<testTable>().InsertOnSubmit(testTableRecord1);
db.SubmitChanges();
db = new DataClasses1DataContext(@"Data Source=");
var testTableRecord2 = new testTable();
db.GetTable<testTable>().InsertOnSubmit(testTableRecord2);
db.SubmitChanges();
Если вы хотите понять, что происходит, попробуйте поместить точку останова в метод Parital InsertTestTable.Вы увидите, что он не вызывается после второго вызова SubmitChanges ().Каждый экземпляр контекста данных поддерживает кэш, содержащий каждый объект, который вставляется, обновляется или извлекается.Кеш ведет себя как словарь, используя первичный ключ объекта в качестве ключа словаря.По какой-то причине LINQ запускает пользовательскую логику вставки только один раз для каждой кэшированной сущности.IMO, это ошибка в LINQ, и я не могу найти никакой документации, которая бы оправдывала это поведение.
Чтобы понять, что я имею в виду, попробуйте установить для каждого объекта отдельное значение, и вы увидите, чтопользовательское поведение вставки на самом деле работает правильно:
var db = new DataClasses1DataContext(@"Data Source=");
var testTableRecord1 = new testTable(){ id = -1 };
var testTableRecord2 = new testTable(){ id = -2 };
db.GetTable<testTable>().InsertOnSubmit(testTableRecord1);
db.SubmitChanges();
db.GetTable<testTable>().InsertOnSubmit(testTableRecord2);
db.SubmitChanges();
Мой совет - создавать новый экземпляр контекста данных перед каждым вызовом SubmitChanges (), ИЛИ пакетировать ваши вставки в один SubmitChanges (это лучше всего, есливозможный).При использовании LINQ контекст данных обычно следует рассматривать как недолговечный одноразовый объект.