1

さまざまなテーブルのフィールドを返すパラメータを持つカスタム ストアド プロシージャがあります。このカスタム ストアド プロシージャをエンティティにマップするにはどうすればよいですか? 保存したくないレポートの読み取り専用値などを使用したいだけで、最も類似したエンティティに追加フィールドを追加しようとしましたが、コードでメソッドを実行すると、追加フィールドは null です

4

3 に答える 3

1

解決策 1: ビューを使用する

ビューを使用すると、さまざまなエンティティからデータを集約できます。

<Article>
    <Id />
    <Name />
    <Lines typeName="LineCollection" />

    <cf:method name="LoadArticlesByCommand" body="load(string commandName) from ArticleByCommand where CommandName = @commandName" />

    <cf:view name="ArticleByCommand" autoLightweight="true">   
        <ArticleName expression="Name"/>
        <ArticleQty expression="Lines.Quantity" />
        <CommandName expression="Lines.Command.Name" />
    </cf:view>
</Article>

<Command>
    <Id />
    <Name />
    <Lines typeName="LineCollection" />
</Command>

<Line setType="List">
    <Article typeName="Article" key="true" />
    <Command typeName="Command" key="true" />
    <Quantity typeName="int" />
</Line> 

解決策 2: 軽量エンティティを使用する

ビューを作成する代わりに、ストアド プロシージャで使用されるプロパティのみを含む軽量エンティティを作成できます。

<cf:entity name="Person" lightweight="true">
  <cf:property name="FirstName" typeName="string" />
  <cf:property name="lastName" typeName="string" />

  <cf:method name="ComputeBalance" 
             body="load () raw" 
             rawBody="SELECT 'John' AS FirstName, 'Doe' AS LastName" />
</cf:entity>

解決策 3: カスタム マッピング

より具体的な値または型については、データベースの値を .NET 型にマップするカスタム メソッドを提供できます。このカスタム メソッドはDataReaderas パラメータで呼び出されます。つまり、開発者は自分のやりたいことを何でも実行できます。

<cf:entity name="Sample">
  <cf:method name="LoadPair" body="raw" rawBody="SELECT 1234,5678" 
             returnTypeName="CodeFluent.Runtime.Utilities.Pair&lt;System.Int32,System.Int32&gt;" 
             cfom:methodName="On{0}" />
  <cf:snippet>
    private static CodeFluent.Runtime.Utilities.Pair&lt;int,int&gt; OnLoadPair(System.Data.IDataReader reader)
    {
        return new Pair&lt;int, int&gt;(reader.GetInt32(0), reader.GetInt32(1));
    }
   </cf:snippet>
</cf:entity>

OnAfterReadRecordまたはOnBeforeReadRecordルールを使用することもできます

于 2016-03-20T12:50:05.040 に答える
0

カスタム ストアド プロシージャの結果をエンティティにマップすることが必須でない場合は、DataSet の組み込みサポートを使用することもできます。

http://blog.codefluententities.com/2011/06/22/dataset-support-in-codefluent-entities/

<cf:method name="LoadAllCities" body="raw" returnTypeName="System.Data.DataSet">
SELECT $Address::City$ FROM $Address$
</cf:method>

.

DataSet ds = Address.LoadAllCities();
foreach (DataTable table in ds.Tables)
{
    foreach (DataRow row in table.Rows)
    {
        Console.WriteLine("City: " + row[0]);
    }
}
于 2016-03-21T13:18:25.040 に答える
0

あなたの質問を読み直すと、私は別の答えを提供しています。

「最も類似したエンティティに余分なフィールドを追加しようとしましたが、コードでメソッドを実行すると、余分なフィールドはnullです」と言った部分に応えて。次の手順でその問題を解決できるはずです。

  1. 自動的に作成されたストアド プロシージャの 1 つを SQL Management Studio で実行します。
  2. 手動で作成したストアド プロシージャを実行します。
  3. 両方のストアド プロシージャから返されるフィールド名が一致することを確認します。

上記で当面の問題は解決すると思いますが、それでも解決策は気に入りません。その理由は、あなたが最も類似したエンティティを選択したと言ったからです。特にストアド プロシージャがすべてのエンティティ プロパティにマップされていない場合は、将来的に問題が発生すると思います。

軽量エンティティ、ビュー、または DataSet のいずれかをお勧めします。

于 2016-03-21T19:40:12.237 に答える