Jon*_*t92 0 c# orm async-await micro-orm
我正在使用 NuGet 包AsyncPoco v1.2,官方PetaPoco的异步分支——“适合你的 POCO 的一个小 ORM东西”。选择的 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; }
}
Run Code Online (Sandbox Code Playgroud)
我为所需的属性赋值,然后尝试执行 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;
}
Run Code Online (Sandbox Code Playgroud)
但是,我在尝试 InsertAsync 时收到以下错误:“Oracle.ManagedDataAccess.Client.OracleException:ORA-00904:“NAME”:标识符无效”
这显然是正确的,因为标识符实际上是 Column 属性值中所述的“name_col”。
当我更改 Poco 对象以使其包含实际的数据库列名称作为其属性名称时,插入工作正常,例如:
public class PocoModel
{
public long ID_COL { get; set; }
public long NAME_COL { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
是否可以使用列属性来识别表列,或者是否有其他方法可以解决该问题?我希望我遗漏了一些东西,否则我们将不得不放弃这个包,因为我们不能在业务代码中使用这种非常规的属性名称。将表列名称更改为 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;
}
Run Code Online (Sandbox Code Playgroud)
我试图通过使用 ColumnAttribute 的 Name 属性来具体说明列的名称,但它没有改变任何东西(因为它不应该改变,因为参数被分配给了 ColumnAttribute 的 Name 属性,在别处,但我想检查以防万一),例如:
[Column(Name = "NAME_COL")]
Run Code Online (Sandbox Code Playgroud)
所有输入表示赞赏。