codefluent自定义存储过程

时间:2016-03-19 04:27:21

标签: codefluent

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

3 个答案:

答案 0 :(得分: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类型。这个自定义方法将以DataReader作为参数调用,这意味着开发人员可以做任何他想做的事。

<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>

您还可以使用OnAfterReadRecordOnBeforeReadRecord规则

答案 1 :(得分: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]);
    }
}

答案 2 :(得分:0)

重新阅读你的问题后我会提供另一个答案。

响应你所说的部分&#34;我尝试将额外的字段添加到最相似的实体,但是当我在代码中执行该方法时,额外的字段为空&#34;。以下步骤应该能够解决这个问题。

  1. 在SQL Management Studio中执行自动创建的存储过程之一。
  2. 执行手动创建的存储过程。
  3. 验证两个存储过程返回的字段名是否匹配。
  4. 我认为以上问题可以解决您的问题,但我仍然不喜欢这个解决方案。原因是您说您选择了最相似的实体。我认为这将导致将来出现问题,特别是如果存储过程没有映射到所有实体属性。

    我建议使用轻量级实体,视图或DataSet。