Вам не нужно беспокоиться об этом. 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.