Это код, который SubSonic запускает для БД, чтобы определить, является ли он вычисляемым столбцом:
const string COLUMN_SQL=@"SELECT
TABLE_CATALOG AS [Database],
TABLE_SCHEMA AS Owner,
TABLE_NAME AS TableName,
COLUMN_NAME AS ColumnName,
ORDINAL_POSITION AS OrdinalPosition,
COLUMN_DEFAULT AS DefaultSetting,
IS_NULLABLE AS IsNullable, DATA_TYPE AS DataType,
CHARACTER_MAXIMUM_LENGTH AS MaxLength,
DATETIME_PRECISION AS DatePrecision,
COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'), COLUMN_NAME, 'IsIdentity') AS IsIdentity,
COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'), COLUMN_NAME, 'IsComputed') as IsComputed
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME=@tableName
ORDER BY OrdinalPosition ASC";
Это утверждение должно представлять интерес:
COLUMNPROPERTY(object_id('[' + TABLE_SCHEMA + '].[' + TABLE_NAME + ']'),
COLUMN_NAME, 'IsComputed') as IsComputed
Сначала вы должны запустить это для своей базы данных, чтобы определить, верен ли результат.
Второе, что я заметил, это то, что, даже если это значение запрашивается из БД, оно не устанавливается в коде:
List<Column> LoadColumns(Table tbl){
var result=new List<Column>();
var cmd=GetCommand(COLUMN_SQL);
cmd.Parameters.AddWithValue("@tableName",tbl.Name);
using(IDataReader rdr=cmd.ExecuteReader(CommandBehavior.CloseConnection)){
while(rdr.Read()){
Column col=new Column();
col.Name=rdr["ColumnName"].ToString();
col.CleanName=CleanUp(col.Name);
col.DataType=rdr["DataType"].ToString();
col.SysType=GetSysType(col.DataType);
col.DbType=GetDbType(col.DataType);
col.AutoIncrement=rdr["IsIdentity"].ToString()=="1";
col.IsNullable=rdr["IsNullable"].ToString()=="YES";
int.TryParse(rdr["MaxLength"].ToString(),out col.MaxLength);
result.Add(col);
}
}
return result;
}
Код от https://github.com/subsonic/SubSonic-3.0-Templates/blob/master/ActiveRecord/SQLServer.ttinclude
Вам следует изменить локальную копию SQLServer.ttinclude и добавить строку (перед методом result.Add (col)), которая выглядит следующим образом:
col.IsComputed=rdr["IsComputed"].ToString()=="1";
(в зависимости от результата запроса это может быть «ДА» вместо «1»).
Объект Column имеет свойство IsComputed
,
https://github.com/subsonic/SubSonic-3.0/blob/master/SubSonic.Core/Schema/IColumn.cs
но опять же, я не знаю, соблюдается ли это при обновлении / вставке.
Если это не так, попробуйте установить для col.IsReadOnly
значение true.
И последнее.
Если модификация SQLServer.ttinclude устраняет вашу проблему, вы должны добавить запрос на получение на дозвуковой странице github.
Edit:
Прежде чем возиться с SQLServer.ttinclude, вы можете добавить
col.IsComputed = true;
непосредственно к вашему файлу Structs.cs (но он будет переопределен при следующем запуске шаблона).