Глядя на решения с точки зрения исходного SQL:
1.
INSERT INTO [dbo].[testTable] VALUES (NEXT VALUE FOR [dbo].[seq_PK_tblTestTable], 1)
Насколько я могу сказать, просто невозможно сделать в LINQ to SQL
2.
INSERT INTO [dbo].[testTable] (a) VALUES (1)
Этого можно достичь в LINQ to SQL, исключив свойство id из сущности testTable
.
Если вам нужно извлечь идентификаторы из таблицы, вы можете создать отдельные сущности для вставки и запроса:
public class testTableInsert {
[ColumnAttribute(...)]
public int a
}
public class testTableResult {
[ColumnAttribute(...)]
public int id
[ColumnAttribute(...)]
public int a
}
3.
DECLARE @nextId INT;
SELECT @nextId = NEXT VALUE FOR [dbo].[seq_PK_tblTestTable];
INSERT INTO [dbo].[testTable] VALUES (@nextId, 1)
Как вы упомянули,это может быть достигнуто путем ручного запроса следующего идентификатора перед каждой вставкой.Если вы идете по этому пути, есть несколько способов добиться этого в вашем коде, вы можете рассмотреть хранимые процедуры или использовать контекст данных LINQ, чтобы вручную выполнить sql для получения следующего значения последовательности.
Вот пример кода, демонстрирующийкак расширить сгенерированный DataContext, используя частичные методы.
public partial class MyDataContext : System.Data.Linq.DataContext
{
partial void InsertTestTable(TestTable instance)
{
using (var cmd = Connection.CreateCommand())
{
cmd.CommandText = "SELECT NEXT VALUE FOR [dbo].[seq_PK_TestTable] as NextId";
cmd.Transaction = Transaction;
int nextId = (int) cmd.ExecuteScalar();
instance.id = nextId;
ExecuteDynamicInsert(instance);
}
}
}
Как только вышеперечисленное будет реализовано, вы можете безопасно вставлять подобные объекты, и они будут генерировать правильный идентификатор последовательности.
TestTable entity = new TestTable { a = 2 };
dataContext.TestTables.InsertOnSubmit(entity);
dataContext.SubmitChanges();