我需要在表格中插入记录。
Subsonic构建这样的查询(据我所知):
INSERT INTO Table1
(Title, Description, RowVersion)
VALUES
(@Title, @Description, @RowVersion)
但我想从SQL查询中删除RowVersion列,因为它是由sql server自动生成的。 我怎么能这样做?
答案 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#>
});
}