我正在使用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类。这感觉就像我出错了。有什么想法吗?
答案 0 :(得分:2)
导致错误是因为GridView在使用boundfields时不处理多态数据源。所以你有两个选择
使用可以处理多态数据源的TemplateFields,这可能会改变您的一些前端代码和GridView事件。
使用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;
就是这样:))