2017-11-27 7 views
0

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")] 

すべての入力が高く評価されています。

答えて

3

私は以前この特定のライブラリを使用していませんでしたが、ソースをgithubですばやく確認して、this ColumnAttributeを見つけました。あなたはそれを.NETの代わりに使ってみましたか?

+0

ありがとうございます。 ColumnはColumnAttributeの省略表記ですので、これは実際に使用するクラスであり、私が使用しているクラスであるということは間違いありません。掘り下げてありがとう:) – Jonast92

+0

待って、あなたは何かにしている! AsyncPocoを試しているうちに、Pocoパッケージへの参照が残っています.PetoPoco名前空間のColumn属性を参照していました。古いPetaPocoのリファレンスを削除したり、AsyncPoco.Columnを指定すると、正しいカラム属性を使用することができ、動作するようです。 – Jonast92

+0

この素晴らしいヒントありがとう! – Jonast92

1

@ Davidのヒントのおかげで、私はこの問題を解決できました。それにもかかわらず、私は.NET ColumnAttributeプロパティを使用していませんでしたが(私はそうではありませんでした)、間違ったものを使用していました。

問題は、まだPetaPoco名前空間への参照があり、AsyncPoco ColumnAttributeを使用する代わりにPetaPoco ColumnAttributeを参照していたことでした。それは明らかに機能しません。

PetaPocoネームスペースへの参照を削除すると、正しいColumnAttributeを使用できるようになります。

関連する問題