C# 代码可以编译,但DbContext.SaveChanges()最终尝试强制转换[…]Generic.List`1[x]';输入';x';
我刚刚完成了对一些代码的重分解,现在在保存C# 代码可以编译,但DbContext.SaveChanges()最终尝试强制转换[…]Generic.List`1[x]';输入';x';,c#,asp.net-mvc-3,entity-framework,entity-framework-4.3.1,C#,Asp.net Mvc 3,Entity Framework,Entity Framework 4.3.1,我刚刚完成了对一些代码的重分解,现在在保存DbContext时出现了这个错误,因为后面的一些计算代码不应该受到我刚才所做更改的影响 错误是: {”无法强制转换类型为的对象 'System.Collections.Generic.List'1[\u 3T.NewDomain.Quote.Pricing.PriceLineItem]' 键入“\u 3T.NewDomain.Quote.Pricing.PriceLineItem”。” 调用时会触发它:DbContext.SaveChanges() 我
DbContext
时出现了这个错误,因为后面的一些计算代码不应该受到我刚才所做更改的影响
错误是:
{”无法强制转换类型为的对象
'System.Collections.Generic.List'1[\u 3T.NewDomain.Quote.Pricing.PriceLineItem]'
键入“\u 3T.NewDomain.Quote.Pricing.PriceLineItem”。”
调用时会触发它:DbContext.SaveChanges()
我将开始一个相当长的调试过程。但是,我完全搞不懂代码是如何编译的。然而,DbContext
试图将列表分配给单个实例变量
有没有人遇到过会导致这样的事情?
我忽略了什么?我找到了答案。我把它贴在这里,以防对别人有帮助 考虑到错误与EF有关,并且代码已编译,我首先假设这很可能是一个配置错误 提供一些附加信息:位于错误焦点的
PriceLineItem
类可以嵌套在自身中,提供树结构。还有一些类继承自PriceLineItem
,例如IssuePriceLineItem
早在我开始使用这种新的树结构时,我就使用fluent API在我的DbContext
类中手动定义了以下配置:
modelBuilder.Entity<IssuePriceLineItem>()
.HasOptional(p => p.PriceLineItems)
.WithMany()
.HasForeignKey(c => c.ParentLineItemId);
但是,最好的解决办法(IMO)是完全删除此条目。由于使用了属性名称,配置之上的约定充分考虑了此关系定义感谢@Ric的建议。我想不出什么样的代码适合显示。真的,我是在找一个“根据目前的证据,开始看这里”。后来我明白了这一点,现在(事后来看)我知道EF fluent配置代码应该是可以分享的相关代码片段。
modelBuilder.Entity<IssuePriceLineItem>()
.HasOptional(p => p.ParentLineItem)
.WithMany() /* implies ICollection<PriceLineItem> PriceLineItems */
.HasForeignKey(c => c.ParentLineItemId);
modelBuilder.Entity<IssuePriceLineItem>()
.HasMany(p => p.PriceLineItems)
.WithOptional() /* implies ParentLineItem navigation property */
.HasForeignKey(c => c.ParentLineItemId);
modelBuilder.Entity<PriceLineItem>()
.HasOptional(p => p.ParentLineItem)
.WithMany(p => p.PriceLineItems)
.HasForeignKey(c => c.ParentLineItemId);