Subsonic:如何排除表列,使其不包含在生成的SQL查询中

时间:2009-10-12 04:51:16

标签: sql subsonic

我需要在表格中插入记录。

Subsonic构建这样的查询(据我所知):

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

但我想从SQL查询中删除RowVersion列,因为它是由sql server自动生成的。 我怎么能这样做?

2 个答案:

答案 0 :(得分:2)

您无需担心这一点。 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();
}

FIXED : - Yippe,我在原因上旋转了一下,因为这在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: - 请从here获得亚音速s。在以前的版本中,只有null和AutoIncrement被包含在Add and Update列列表中,但此代码也会检查ReadOnly属性。

答案 1 :(得分:0)

我对时间戳字段感到悲伤,所以只是在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#>
 });
}