1

我有一个带有 in 参数的自定义存储过程,它返回不同表的字段,我如何将这个自定义存储映射到实体?我只想将只读值用于我不想保存的报告或类似的东西我尝试将额外字段添加到最相似的实体但是当我在代码中执行该方法时额外字段为空

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>

你也可以使用OnAfterReadRecordorOnBeforeReadRecord规则

于 2016-03-20T12:50:05.040 回答
0

如果不必将自定义存储过程的结果映射到实体,则另一个选项是使用对 DataSets 的内置支持。

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

重新阅读您的问题后,我将提供另一个答案。

针对您所说的部分“我尝试将额外字段添加到最相似的实体,但是当我在代码中执行该方法时,额外字段为空”。以下步骤应该能够解决该问题。

  1. 在 SQL Management Studio 中执行自动创建的存储过程之一。
  2. 执行您手动创建的存储过程。
  3. 验证两个存储过程返回的字段名是否匹配。

我认为以上将解决您的直接问题,但我仍然不喜欢该解决方案。原因是您说您选择了最相似的实体。我认为这将在未来引起问题,特别是如果存储过程没有映射到所有实体属性。

我会推荐轻量级实体、视图或数据集。

于 2016-03-21T19:40:12.237 回答