2

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

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:“)”处或附近的语法错误

当我查看正在传递的异常中的语句时,它看起来像这样:

{插入“mytable”()值()}

即使当我按如下方式投射“this”时,结果也是一样的:

try
{
    BaseDataObject<TDOType> q = this;
    return conn.Insert<Guid, BaseDataObject<TDOType>>(q);
}

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

4

1 回答 1

4

我没有 postgresql 数据库;我使用了 SQL Server。但这应该没关系。

您的问题是投射通用对象。只需调用conn.Insert以下代码:

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

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

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

{插入“mytable”()值()}

当您发布问题时,请查看您的案例中生成的 SQL 查询。它不包含列列表。为什么?MyTable因为 SimpleCRUD在基类中发送时无法看到派生的属性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); 
}
于 2019-07-30T15:04:42.170 回答