c# - 尝试使用 Dapper.SimpleCRUD 插入泛型时出错

标签 c# generics .net-core dapper dapper-simplecrud

我正在尝试为我的 DataObject 创建一个通用基类,如下所示:

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;
        }
    }
}

我继承的类:

[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);
}

看起来通用函数没有正确地看到我继承的类的成员。我做错了什么?

最佳答案

我没有 postgresql 数据库;我使用 SQL Server。但这应该不重要。

您的问题是转换通用对象。只需调用 conn.Insert如下所示:

return conn.Insert<Guid, TDOType>(this as TDOType);

请注意我如何将参数转换为派生类,而不是将基类发送到 conn.Insert方法。这样,SimpleCRUD就可以访问派生类的成员。

在您的代码中,它无法看到派生类的成员。因此,它无法生成查询。

{insert into "mytable" () values ()}

查看您发布相关问题时在您的案例中生成的 SQL 查询。它不包含列列表。为什么?因为SimpleCRUD看不到派生MyTable的属性当您发送基类 BaseDataObject<TDOType> 时.


我使用了以下数据库脚本:

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); 
}

关于c# - 尝试使用 Dapper.SimpleCRUD 插入泛型时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57204675/

相关文章:

c# - 动态方法预链接

java - 为什么接口(interface)的泛型方法可以在 Java 中实现为非泛型?

generics - 如何在具有通用参数的结构上实现非通用特征

.net - 在 sles 11 中运行 .NET

.net - 如何在 .Net Core 上使用 Apache Tika?

c# - 在网格加载和处理过程中如何转换蒙皮网格?

C# windows 窗体检查所有条目然后显示消息框

c# - 通用打字困惑

.net - 使用 VS 2017 的 FDD 或 SCD 部署

c# - 更改 WinForm 按钮文本颜色?