Дозвуковой: Как исключить столбец таблицы, чтобы он не включался в сгенерированный запрос SQL - PullRequest
1 голос
/ 12 октября 2009

Мне нужно вставить запись в таблицу.

Subsonic создает запрос примерно так (насколько я знаю):

INSERT INTO Table1
(Title, Description, RowVersion)
VALUES 
(@Title, @Description, @RowVersion)

Но я хочу удалить столбец RowVersion из запроса SQL, поскольку он автоматически генерируется сервером sql. Как я могу это сделать?

Ответы [ 2 ]

2 голосов
/ 12 октября 2009

Вам не нужно беспокоиться об этом. SubSonic достаточно умен, чтобы справиться с этим!

Просто создайте новый объект, присвойте значения свойствам и сохраните его.

var o = new DataObject();
o.Name="Foo";
o.Age = 20;
//o.RowVersion = ....; DON'T ASSIGN THIS
o.Save();

РЕДАКТИРОВАТЬ: - Вот что я пытался:

Определение таблицы:

CREATE TABLE [dbo].[TestTimeStamp](
[RowID] [int] IDENTITY(1,1) NOT NULL PRIMARY KEY,
[Description] [nvarchar](50) NOT NULL,
[RowVersion] [timestamp] NOT NULL
)

Код:

private static void Test()
{
    var o = new TestTimeStamp();
    o.Description = "Hello World";
    o.Save();
}

ИСПРАВЛЕНО : - Да, я крутил голову над причиной, как этого никогда не было в SubSonic 2. Я разветвлял код SubSonic 3, но там не было ничего, чтобы найти. Затем, после большого дурачения, я еще раз изучил шаблоны T4. Если свойство IsReadOnly не задано, но проверяется при создании вставки, обновите запросы в классе SubSonic.Extension.Object.cs. Таким образом, решение состоит в том, чтобы добавить строку в Structs.tt файл for цикла, который добавляет столбцы в классы таблицы :). Для исправления найдите следующий цикл (он начинается в строке 30)

<# foreach(var col in tbl.Columns){#>
       Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
       {

и измените инициализацию нового DatabaseColumn следующим образом:

   Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
   {
       IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
       DataType = DbType.<#=col.DbType.ToString()#>,
       IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
       AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
       IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,

       //THIS LINE DO THE TRICK.
       IsReadOnly = <#=col.DataType.ToLower().Equals("timestamp")
                          .ToString().ToLower() #>
   });

PS: - Пожалуйста, получите дозвуковой источник от здесь . В предыдущей версии только null и AutoIncrement проверяются при включении в список столбцов Add и Update, но этот код также проверяет наличие свойства ReadOnly.

0 голосов
/ 18 марта 2010

У меня было горе с полями меток времени, поэтому я просто исключил столбцы меток времени в Structs.tt. То же место, что и в строке 30. При этом используется текущая основная проверка SubSonic 3.0

if(<#=col.DataType.ToLower().Equals("timestamp").ToString().ToLower() #>)
{}else{
 Columns.Add(new DatabaseColumn("<#=col.Name#>", this)
 {
      IsPrimaryKey = <#=col.IsPK.ToString().ToLower()#>,
      DataType = DbType.<#=col.DbType.ToString()#>,
      IsNullable = <#=col.IsNullable.ToString().ToLower()#>,
      AutoIncrement = <#=col.AutoIncrement.ToString().ToLower()#>,
      IsForeignKey = <#=col.IsForeignKey.ToString().ToLower()#>,
      MaxLength = <#=col.MaxLength#>
 });
}
...