EF 4.0 Dynamic Proxies POCO对象与目标类型不匹配

时间:2010-06-22 15:03:18

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

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

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

将新记录保存到数据库后,数据绑定到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类。这感觉就像我出错了。有什么想法吗?

3 个答案:

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

答案 1 :(得分:1)

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

使用context.CreateObject<Scenario>创建(POCO)对象i.s.o时,问题消失了。 a .... =新情景()。

答案 2 :(得分:1)

今天面对同样的问题并使用Value Injecter来解决它。它很简单:

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

就是这样:))