尝试使用 Dapper.SimpleCRUD 插入泛型时出错
Error trying to insert generic with Dapper.SimpleCRUD
我正在尝试为我的数据对象创建一个通用基础 class,如下所示:
public abstract class BaseDataObject<TDOType> where TDOType : class
{
public static TDOType Get(Guid lObjectUUID, NpgsqlConnection conn)
{
return conn.Get<TDOType>(lObjectUUID);
}
public Guid Insert(NpgsqlConnection conn)
{
try
{
return conn.Insert<Guid, BaseDataObject<TDOType>>(this);
}
catch (Exception ex)
{
throw;
}
}
}
我继承了class:
[Table("mytable")]
public class MyTable : BaseDataObject<MyTable>
{
[Key]
[Column("mytableuuid")]
public Guid MyTableUUID { get; set; }
[Column("clientuuid")]
public Guid ClientUUID { get; set; }
}
当我从继承的对象调用此方法时,我收到以下消息:
42601: syntax error at or near ")"
当我查看正在传递的异常中的语句时,它看起来像这样:
{insert into "mytable" () values ()}
即使我像下面这样投'this',结果也是一样的:
try
{
BaseDataObject<TDOType> q = this;
return conn.Insert<Guid, BaseDataObject<TDOType>>(q);
}
看起来通用函数没有正确地看到我继承的 class 的成员。我做错了什么?
我没有postgresql数据库;我使用 SQL 服务器。但这应该无关紧要。
您的问题是转换通用对象。只需像下面这样调用 conn.Insert
:
return conn.Insert<Guid, TDOType>(this as TDOType);
请注意我是如何将参数转换为派生的 class 而不是将基础 class 发送到 conn.Insert
方法。这样,SimpleCRUD 就可以访问 derived class.
的成员
在您的代码中,无法看到派生 class 的成员。因此,它无法生成查询。
{insert into "mytable" () values ()}
查看您的案例中生成的 SQL 查询,因为您 post 有问题。它不包含列列表。为什么?因为 SimpleCRUD 在发送基础 class BaseDataObject<TDOType>
.
时看不到派生 MyTable
的属性
我使用了以下数据库脚本:
CREATE TABLE [mytable]
(
[mytableuuid] [UNIQUEIDENTIFIER] NOT NULL,
[clientuuid] [UNIQUEIDENTIFIER] NOT NULL
)
模型声明如下:
[Table("mytable")]
public class MyTable : BaseDataObject<MyTable>
{
[Key]
[Column("mytableuuid")]
public Guid MyTableUUID { get; set; }
[Column("clientuuid")]
public Guid ClientUUID { get; set; }
}
public abstract class BaseDataObject<TDOType> where TDOType : class
{
public static TDOType Get(Guid lObjectUUID, SqlConnection conn)
{
return conn.Get<TDOType>(lObjectUUID);
}
public Guid Insert(SqlConnection conn)
{
try
{
return conn.Insert<Guid, TDOType>(this as TDOType);//<--Just change this call
}
catch(Exception ex)
{
throw;
}
}
}
以下是我如何调用 Insert
方法:
using(SqlConnection conn = new SqlConnection(@"connectionstring"))
{
MyTable myTable = new MyTable();
myTable.MyTableUUID = Guid.NewGuid();
myTable.ClientUUID = Guid.NewGuid();
myTable.Insert(conn);
}
我正在尝试为我的数据对象创建一个通用基础 class,如下所示:
public abstract class BaseDataObject<TDOType> where TDOType : class
{
public static TDOType Get(Guid lObjectUUID, NpgsqlConnection conn)
{
return conn.Get<TDOType>(lObjectUUID);
}
public Guid Insert(NpgsqlConnection conn)
{
try
{
return conn.Insert<Guid, BaseDataObject<TDOType>>(this);
}
catch (Exception ex)
{
throw;
}
}
}
我继承了class:
[Table("mytable")]
public class MyTable : BaseDataObject<MyTable>
{
[Key]
[Column("mytableuuid")]
public Guid MyTableUUID { get; set; }
[Column("clientuuid")]
public Guid ClientUUID { get; set; }
}
当我从继承的对象调用此方法时,我收到以下消息:
42601: syntax error at or near ")"
当我查看正在传递的异常中的语句时,它看起来像这样:
{insert into "mytable" () values ()}
即使我像下面这样投'this',结果也是一样的:
try
{
BaseDataObject<TDOType> q = this;
return conn.Insert<Guid, BaseDataObject<TDOType>>(q);
}
看起来通用函数没有正确地看到我继承的 class 的成员。我做错了什么?
我没有postgresql数据库;我使用 SQL 服务器。但这应该无关紧要。
您的问题是转换通用对象。只需像下面这样调用 conn.Insert
:
return conn.Insert<Guid, TDOType>(this as TDOType);
请注意我是如何将参数转换为派生的 class 而不是将基础 class 发送到 conn.Insert
方法。这样,SimpleCRUD 就可以访问 derived class.
在您的代码中,无法看到派生 class 的成员。因此,它无法生成查询。
{insert into "mytable" () values ()}
查看您的案例中生成的 SQL 查询,因为您 post 有问题。它不包含列列表。为什么?因为 SimpleCRUD 在发送基础 class BaseDataObject<TDOType>
.
MyTable
的属性
我使用了以下数据库脚本:
CREATE TABLE [mytable]
(
[mytableuuid] [UNIQUEIDENTIFIER] NOT NULL,
[clientuuid] [UNIQUEIDENTIFIER] NOT NULL
)
模型声明如下:
[Table("mytable")]
public class MyTable : BaseDataObject<MyTable>
{
[Key]
[Column("mytableuuid")]
public Guid MyTableUUID { get; set; }
[Column("clientuuid")]
public Guid ClientUUID { get; set; }
}
public abstract class BaseDataObject<TDOType> where TDOType : class
{
public static TDOType Get(Guid lObjectUUID, SqlConnection conn)
{
return conn.Get<TDOType>(lObjectUUID);
}
public Guid Insert(SqlConnection conn)
{
try
{
return conn.Insert<Guid, TDOType>(this as TDOType);//<--Just change this call
}
catch(Exception ex)
{
throw;
}
}
}
以下是我如何调用 Insert
方法:
using(SqlConnection conn = new SqlConnection(@"connectionstring"))
{
MyTable myTable = new MyTable();
myTable.MyTableUUID = Guid.NewGuid();
myTable.ClientUUID = Guid.NewGuid();
myTable.Insert(conn);
}