【问题标题】:Issue with Object Context Translate method for parent child object父子对象的对象上下文翻译方法问题
【发布时间】:2014-03-19 10:31:53
【问题描述】:

我对对象上下文翻译方法的 EF 有疑问。

我创建了一个名为 PremiumCalculationASView 的视图

 public class PremiumCalculationASView : BaseProposalASView
{
    public PreCalProView PreCalProView { get; set; }

    public PreCalInsView PreCalInsView { get; set; }

    public PreCalPolView PreCalPolView { get; set; }
}

在这个视图上,我有一个三个属性,它也是一个视图。这是其中之一

 public class PreCalPolView
{        
    [DataMember]       
    public bool PWRRider { get; set; }

    [DataMember]        
    public Int32 PremiumPayingTerm { get; set; }

    [DataMember(Name = "Premium")]
    public decimal Premium { get; set; }
}

现在我正在调用一个存储过程来填充 PremiumCalculationASView 对象

public PremiumCalculationASView GetQuotationDetails(PremiumCalculationASView premiumCalculationView, string applicationConnectionString)
    {
        Database db = new Database(applicationConnectionString);
        DbConnection connection = null;
        DbCommand command = null;
        List<DbParameter> dbparams = new List<DbParameter>();
        var result = new List<PremiumCalculationASView>();

        try
        {
            db.AddInParam(dbparams, "PkQuotationId", DbType.Int32, premiumCalculationView.QuotationId);
            db.BuildOutParam(dbparams, "ErrorCode", DbType.String, 30);
            db.BuildOutParam(dbparams, "TotalRecords", DbType.String, 30);


            DbDataReader objReader = db.ExecuteReader(ref connection, ref command, "[eApp_GET_QUOTATION_DETAILS]", CommandType.StoredProcedure, dbparams.ToArray());
            using (var context = new OnlineSalesContainer())
            {
                //result.AddRange(context.Translate<PremiumCalculationASView>(objReader,));
                var preCalPolViewMap = new DataReaderAutoMap<PreCalPolView>();
                var premiumCalculationASViewMap = new DataReaderAutoMap<PremiumCalculationASView>()
                        .Specify((s, t) => t.PreCalPolView = preCalPolViewMap.Create(objReader));
                result = premiumCalculationASViewMap.CreateList(objReader);                    
            }
        }
        catch
        {
            throw;
        }
        finally
        {
            db.CloseReader(ref connection, ref command);
        }
        return result[0];

    }

现在的问题是 PremiumCalculationASView 根属性已填充,但子对象 [PreCalInsView] 属性未填充。

我检查了 SP,它正在返回我需要的数据,并且数据成员名称在 SP 中也相同。 请让我知道我在这里做错了什么。

编辑 问题解决了 ! 这是通过使用 github 上的任何对象到对象的映射库来完成的:Sixeyed.Mapping

【问题讨论】:

  • sproc 只返回平面结果,context.Translate 只处理平面结果。它不能创建整个对象图。您必须自己构建对象。
  • 感谢@Gert Arnold 的帮助。现在我在 github 上使用任何对象到对象的映射库:Sixeyed.Mapping
  • 您介意展示一下您是如何做到这一点的,以回答您自己的问题吗?这可能是一种很有前途的方法,但该库的文档是null
  • @GertArnold 我已经更新了我的问题,请检查 **var preCalPolViewMap = new DataReaderAutoMap(); var premiumCalculationASViewMap = new DataReaderAutoMap() .Specify((s, t) => t.PreCalPolView = preCalPolViewMap.Create(objReader));结果 = premiumCalculationASViewMap.CreateList(objReader); **
  • 请把它放在答案中,以便我们阅读。您可以将自己的答案标记为已接受。

标签: c# asp.net asp.net-mvc-3 entity-framework


【解决方案1】:

我已经通过使用 github 上的任何对象到对象的映射库解决了这个问题:Sixeyed.Mapping

使用数据读取器的 AutoMap 方法,您可以映射具有相同名称的对象,

var preCalPolViewMap = new DataReaderAutoMap<PreCalPolView>();
            var premiumCalculationASViewMap = new DataReaderAutoMap<PremiumCalculationASView>()
                    .Specify((s, t) => t.PreCalPolView = preCalPolViewMap.Create(objReader));
            result = premiumCalculationASViewMap.CreateList(objReader);                    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多