NuGetパッケージAsyncPoco v1.2、公式PetaPocoの非同期フォーク - 「POCOのための小さなORM-ishのもの」を使用しています。選択したDBRMはOracleですが、それはまったく関係ありません。Column属性を使用してAsyncPocoを使用して列名にプロパティを関連付けることができません
従来のPetaPocoパッケージは魅力的な働きをしていましたが、私の問題はAsyncPocoパッケージがColumn属性の値を使用していないということです。代わりに、プロパティ名を直接列として使用します識別子。
例:
私は場合は、次のエラーが表示さしかしながらポコ
[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;
}
を実行しよう作成ORA-00904: "NAME":無効な識別子 ""を挿入しようとしました。
明らかに正しいのは、識別子が実際には列属性値に記載されているように「name_col」であるためです。
それはその属性名と実際のデータベースカラム名を含むように私はポコオブジェクトを変更すると、その後の挿入のような、正常に動作します:
public class PocoModel
{
public long ID_COL { get; set; }
public long NAME_COL { get; set; }
}
が列を使用することも可能です識別するための属性問題を回避するために何か別の方法がありますか?私は何かが不足していることを願っています。もし私たちがビジネスコードのような非典型的なプロパティ名を扱うことができないので、パッケージを捨てなければならないならば。テーブルの列名をパスカル/キャメルケースに変更することは、私が扱っている標準とは反対の選択肢ではありません。
編集:私は名前の変換は(/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")]
すべての入力が高く評価されています。
ありがとうございます。 ColumnはColumnAttributeの省略表記ですので、これは実際に使用するクラスであり、私が使用しているクラスであるということは間違いありません。掘り下げてありがとう:) – Jonast92
待って、あなたは何かにしている! AsyncPocoを試しているうちに、Pocoパッケージへの参照が残っています.PetoPoco名前空間のColumn属性を参照していました。古いPetaPocoのリファレンスを削除したり、AsyncPoco.Columnを指定すると、正しいカラム属性を使用することができ、動作するようです。 – Jonast92
この素晴らしいヒントありがとう! – Jonast92