0

DNN 7+ で使用するモジュールを作成しており、データ アクセスに DAL2 を使用したいと考えていますが、データベースからアイテムを選択する際に問題が発生しています。

私のコードはデータベースに正常に接続しているように見えますが、DAL2 によって生成されたクエリには、データベース テーブル内のフィールドの名前が含まれていません。SQL Server プロファイラーを実行して、データベースに何が届くかを監視し、"SELECT NULL FROM Product..." で始まるクエリを確認しています。「SELECT * FROM Product...」または「SELECT ProductCode FROM Product...」が表示されることを期待しています。

問題を特定し、完全なコード サンプルを含めることができるようにするために、次のようにテストを行いました。 Product.cs ファイルがあります。

using System.Web.Caching;
using DotNetNuke.ComponentModel.DataAnnotations;

namespace MyModule.Components
{
    [TableName("Product")]
    [PrimaryKey("productCode")]
    [Cacheable("MYMODULE_Product_", CacheItemPriority.Default, 20)]
    [Scope("productCode")] //different values here did not change the result.
    public class Product
    {
        public string productCode;
    }
}

ProductRepository.cs ファイルがあります。

using DotNetNuke.Data;

namespace MyModule.Components
{
    public class ProductRepository
    {
        private const string EXTERNAL_DB_CONNECTION_STRING = "MY_DB_CONNECTIONSTRING_NAME";

        public Product GetProduct(string productCode)
        {
            Product t;
            using (IDataContext ctx = DataContext.Instance(EXTERNAL_DB_CONNECTION_STRING))
            {
                var rep = ctx.GetRepository<Product>();
                t = rep.GetById(productCode);
            }
            return t;
        }
    }
}

ビューでこれら 2 つのファイルを次のコードで使用します。

ProductRepository productRepo = new ProductRepository();    
Product product = (Product)productRepo.GetProduct("MYCODE");

このコードを実行している間、SQL Server プロファイラーを使用して監視すると、次のクエリが実行されることがわかります。

exec sp_executesql N'SELECT NULL FROM [Product] WHERE [productCode]=@0',N'@0 nvarchar(4000)',@0=N'MYCODE'

上記の選択クエリが NULL を選択している理由がわかりません。Product.cs ファイルまたは * 文字からの製品フィールドのリストを期待しています。

productCode のデータベース フィールド定義 (Microsoft SQL Server Management Studio のツリー ビューから見た場合) は次のとおりです。

productCode(PK, varchar(50), not null)

外部データベースに接続していますが、データが特定のモジュールまたはポータルに接続されていません。そのため、スコープとして「productCode」を指定します。データがポータルまたはモジュールに関連付けられていない場合、スコープの適切な使用方法がわかりません。問題が Product.cs ファイルの Scope 属性に関連していないことを確認するために、Scope 変数を "PortalId"、"ModuleId"、"productCode"、および "Nothing" に設定してテストしました。これらの値はすべて、SQL Server プロファイラーに同じクエリが表示されました。

また、Scope 属性を完全に削除してテストしました。Scope 属性が含まれていない場合、SQL Server プロファイラーで次のクエリが表示されました。

SELECT NULL FROM [Product]

Scope 属性が除外されたときに WHERE 句が削除された理由はわかりませんが、それがテスト結果で示されました。

Scope 属性を使用したこれらのテストにより、私が見ている「SELECT NULL」の問題とは関係がないと信じるようになりましたが、完全を期すためにここに含めたいと思いました。

なぜこれがNULLで選択を作成するのですか?データを選択するにはどうすればよいですか?

ありがとう!

4

3 に答える 3

1

レーサーオタク、

適切なアクセサーが必要:

public string productCode { get; set; }; 

public string productCode;

私は逃しました!良いキャッチ。

明示的なゲッターとセッターの理由は、Entity Framework POCO の規則に従うだけではなく、明示的にゲッターとセッターを使用すると、クラス メンバーがプロパティではなくパブリック変数であると CLR に伝えていると思います。表面的には、それらは同じように機能します。しかし、PetaPoco がリフレクションを使用してクラス プロパティをフィールドに一致させる場合、それが必要な理由かもしれません。

于 2013-10-08T23:59:17.053 に答える
0

テーブルのフィールドにマップされた属性が 1 つしかないことに気付きました。これは、スコープと主キーの両方としてマークされています。Scope は、アイテム セットをキャッシュする単位です。主キーと同じにするのは意味がありません。通常は、ポータル ID、モジュール ID、カテゴリ ID、または一連の製品レコードを表すものです。

とはいえ、Scope 属性を完全に削除してみてください - 少なくとも今のところは。また、テーブルには「productCode」というフィールドがありますか。PetaPoco では大文字と小文字が区別されるため、正確に一致する必要があると思います。それ以外の場合は、フィールド マッピング属性 [ColumnName("Product_Code")] を productCode メンバーの上に追加して、テーブルのフィールド名と一致させる必要があります。

于 2013-10-08T22:53:45.473 に答える