3

我正在使用 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 类。这感觉就像我做错了什么。有什么想法吗?

4

3 回答 3

2

导致该错误的原因是 GridView 在使用 boundfields 时不处理多态数据源。所以你有两个选择

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

  2. 使用 Linq 创建 boundfields 可以处理的非多态数据源

      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();
    
于 2011-07-15T08:55:40.557 回答
1

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

使用 acontext.CreateObject<Scenario>创建 (POCO) 对象 iso a .... = new Scenario() 时问题消失了。

于 2010-10-25T10:42:39.067 回答
1

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

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

而已 :)

于 2012-03-16T11:43:34.473 回答