【问题标题】:EF 4.0 Dynamic Proxies POCO Object Does not match target typeEF 4.0 动态代理 POCO 对象与目标类型不匹配
【发布时间】:2010-06-22 15:03:17
【问题描述】:

我正在使用 EF 4.0 和 POCO。我在将记录插入数据库时​​偶然发现了这个错误。

对象“BI.Entities.QualityReason”上的属性访问器“QualityReasonID”引发以下异常:“对象与目标类型不匹配。”

在将新记录保存到数据库后,Databind 到 GridView 发生错误。我确定了正在发生的事情,但我不确定为什么会发生或者我是否错误地使用了 EF/POCO。任何见解将不胜感激。

发生异常是因为 IEnumerable 中的对象类型不同。 表中的原始条目的类型为 System.Data.Entity.DynamicProxies.QualityReason_E483AD567288B459706092F1825F53B1F93C65C5329F8095DD1D848B5D039F04} 而新的是 BI.Entities.QuailtyReason。

这是我插入新对象的方法。

   public void createQualityReason(QualityReason qReasons)
    {
        dbcontext.QualityReasons.AddObject(qReasons);
        dbcontext.SaveChanges();   
    }

我通过从以下位置更改获取代码解决了错误:

 public IEnumerable<QualityReason> fetchQualityReasons()
    {

        IEnumerable<QualityReason> queryReasons = dbcontext.QualityReasons.AsEnumerable();
        return queryReasons;
    }

 public IEnumerable<QualityReason> fetchQualityReasons()
    {

        IEnumerable<QualityReason> queryReasons = from data in dbcontext.QualityReasons.AsEnumerable()
                select new QualityReason
                {
                    QualityReasonID = data.QualityReasonID,
                    QualityReasonName = data.QualityReasonName
                };
                    return queryReasons;
    }

所以为了解决这个错误,我每次都必须明确地选择 POCO 类。这感觉就像我做错了什么。有什么想法吗?

【问题讨论】:

  • 我认为这个问题可能与网格视图和数据绑定有关,而不是 EF。

标签: entity-framework entity-framework-4 poco dynamic-proxy


【解决方案1】:

这个错误是因为GridView在使用boundfields时没有处理多态数据源。所以你有两个选择

  1. 使用可以处理多态数据源的 TemplateFields,这可能会更改您的某些前端代码和 GridView 事件。

  2. 使用 Linq 创建绑定字段可以处理的非多态数据源

      So instead of using something like ti 
    
        gvGroups.DataSource = ProductHelper.Get()
        gvGroups.DataBind();
    
    
    
        var query = from p in ProductHelper.Get()
        select new {p.ProductId, p.ProductName, p.ProductDesc, p.ProductLink};
        gvGroups.DataSource = query;
        gvGroups.DataBind();
    

【讨论】:

    【解决方案2】:

    我不知道问题是否已经解决,但我的(POCO)“场景”类也遇到了同样的问题。

    使用context.CreateObject&lt;Scenario&gt; 创建 (POCO) 对象 i.s.o 时问题消失了。 a .... = 新场景()。

    【讨论】:

      【解决方案3】:

      今天遇到同样的问题,用Value Injecter解决了。很简单:

      var dynamicProxyMember = _repository.FindOne<Member>(m=>m.Id = 1);
      var member = new Member().InjectFrom(dynamicProxyMember) as Member;
      

      就是这样:)

      【讨论】:

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