【问题标题】:Unable to use the Column attribute to associate properties to the column names using AsyncPoco无法使用 Column 属性将属性与使用 AsyncPoco 的列名称相关联
【发布时间】:2017-11-27 10:50:36
【问题描述】:

我正在使用 NuGet 包 AsyncPoco v1.2,这是官方 PetaPoco 的异步分支 - “对你的 POCO 来说是一个小小的 ORM-ish”。选择的 DBRM 是 Oracle,但这无关紧要。

到目前为止,经典的 PetaPoco 包一直像魅力一样工作,但我的问题是 AsyncPoco 包没有使用 Column 属性的值,而是完全忽略它,只是使用属性名称作为直接列标识符。

例子:

我创建了 Poco

[PrimaryKey("ID_COL", SequenceName = "SCHEMA.SCHEMA_TABLE_SEQ")]
[TableName("SCHEMA.SCHEMA_TABLE")]
public class PocoModel
{
    [Column("ID_COL")]
    public long Id { get; set; }

    [Column("NAME_COL")]
    public string Name { get; set; }
 }

我将值分配给所需的属性,然后尝试执行 InsertAsync

public async Task InsertPoco(PocoModel model, DbConnection conn)
{
    var taskCompletionSource = new TaskCompletionSource<bool>();
    using (var database = new AsyncPoco.Database(conn))
    {
        await database.InsertAsync(model);
        taskCompletionSource.TrySetResult(true);
    }
    await taskCompletionSource.Task;
}

但是我在尝试 InsertAsync 时收到以下错误:“Oracle.ManagedDataAccess.Client.OracleException: ORA-00904: "NAME": invalid identifier"

这显然是正确的,因为标识符实际上是 Column 属性值中所述的“name_col”。

当我更改 Poco 对象以使其包含实际的数据库列名称作为其属性名称时,插入工作正常,例如:

public class PocoModel
{
    public long ID_COL { get; set; }

    public long NAME_COL { get; set; }
 }

是否可以使用列属性来识别表列,或者是否有其他方法可以解决这个问题?我希望我遗漏了一些东西,否则我们将不得不放弃该包,因为我们无法在业务代码中使用这些非常规的属性名称。将表列名称更改为 pascal/camel-case 不是一种选择,因为它违反了我使用的标准。

编辑:我查看了包的源代码,我认为可能会发生名称转换(/AsyncPoco/Core/ColumnInfo.cs),看起来确实很奇怪不采用 ColumnAttribute 即使它应该是,这里的代码:

// Read attribute
if (ColAttrs.Length > 0)
{
    var colattr = (ColumnAttribute)ColAttrs[0];
    ci.ColumnName = colattr.Name==null ? pi.Name : colattr.Name;
    ci.ForceToUtc = colattr.ForceToUtc;
    if ((colattr as ResultColumnAttribute) != null)
        ci.ResultColumn = true;
    if ((colattr as ComputedColumnAttribute) != null)
        ci.ComputedColumn = true;
}

我试图通过使用 ColumnAttribute 的 Name 属性来明确说明列的名称,但它没有改变任何东西(因为它不应该改变,因为参数被分配给 ColumnAttribute 的 Name 属性,别处,但我想检查以防万一),例如:

[Column(Name = "NAME_COL")]

感谢所有输入。

【问题讨论】:

    标签: c# orm async-await micro-orm


    【解决方案1】:

    我之前没有使用过这个特定的库,但我在 github 上快速浏览了源代码并找到了this ColumnAttribute。您是否尝试过使用它而不是 .NET?

    【讨论】:

    • 感谢您的回复。 Column 是 ColumnAttribute 的简写符号,所以是的,你说得对,这确实是我应该使用的类,并且是我正在使用的类。感谢您的挖掘:)
    • 等一下,你开始做事了!在尝试 AsyncPoco 时,我仍然引用了 Poco 包,事实证明我指的是 PetaPoco 命名空间中的 Column 属性!删除旧的 PetaPoco 参考或特别说 AsyncPoco.Column 允许我使用正确的列属性,它似乎工作。
    【解决方案2】:

    感谢@David 的提示,我能够解决问题。虽然我从未使用过 .NET ColumnAttribute 属性(我想也没有),但我使用了错误的属性。

    问题是我仍然有对 PetaPoco 命名空间的引用,因此引用的是 PetaPoco ColumnAttribute,而不是使用 AsyncPoco ColumnAttribute。这显然行不通。

    删除对 PetaPoco 命名空间的引用确实如此,允许我使用正确的 ColumnAttribute。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-02
      • 1970-01-01
      • 2019-01-21
      相关资源
      最近更新 更多