【问题标题】:InvalidCastException When Calling Attach Entity Framework 5调用 Attach Entity Framework 5 时出现 InvalidCastException
【发布时间】:2014-10-22 15:24:19
【问题描述】:

我又遇到了一个非常奇怪的实体框架问题。

我想:

  • 将对象的哈希集发送到方法
  • 从数据库中加载这些对象
  • 更新每个对象中的一个字段
  • 将对象一次性或单独保存回数据库
  • 我的一些代码是:

    For Each BI As GeneralBasketItem In UsedDiscItems
    Using db As New Till1Entities1 
    db.GeneralBasketItem.Attach(BI)
    

    ''我尝试在 for each 的外部和内部设置上下文来对此进行试验。

    部分数据库架构: http://imgur.com/kA47ZjU

    最后一行有时,并不总是抛出以下异常:

    System.InvalidCastException 未被用户代码处理 H结果=-2147467262 消息=无法将类型为“System.Data.Entity.DynamicProxies.PromAppliedPromDisc_052D0BC99A5A9E842B5774E34C71C0ADE6170E70600ADE549AAA5F0EEA48E49F”的对象转换为类型“CoreTillDAL.PromBaskItemDisc”。 Source=System.Data.Entity

    堆栈跟踪: 在 System.Data.Objects.DataClasses.EntityReference1.AddToLocalCache(IEntityWrapper wrappedEntity, Boolean applyConstraints) at System.Data.Objects.EntityEntry.TakeSnapshotOfSingleRelationship(RelatedEnd relatedEnd, NavigationProperty n, Object o) at System.Data.Objects.EntityEntry.TakeSnapshotOfRelationships() at System.Data.Objects.Internal.EntityWrapperWithoutRelationships1.TakeSnapshotOfRelationships(EntityEntry 条目) 在 System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper WrappedEntity,EntitySet entitySet,String argumentName) 在 System.Data.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager (IEntityWrapper WrappedEntity,布尔 doAttach) 在 System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper WrappedEntity,布尔关系已存在,布尔 addRelationshipAsUnchanged,布尔 doAttach) 在 System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper 包裹实体,布尔 addRelationshipAsUnchanged,布尔 doAttach) 在 System.Data.Objects.DataClasses.EntityReference1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach) at System.Data.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach) at System.Data.Objects.ObjectContext.AttachTo(String entitySetName, Object entity) at System.Data.Entity.Internal.Linq.InternalSet1.c__DisplayClass2.b__1() 在 System.Data.Entity.Internal.Linq.InternalSet1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) at System.Data.Entity.Internal.Linq.InternalSet1.Attach(对象实体) 在 System.Data.Entity.DbSet1.Attach(TEntity entity) at CoreTillDAL.PromSetPrice.AdjustBaskItems(HashSet1 UsedDiscItems) 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Plugins Classes\PromAndDisc\PromSetPriceE.vb:line 60 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Core Classes\EF Ext Classes\Till\GeneralBasketE.vb:line 245 中的 CoreTillDAL.GeneralBasket.AdjustBIsforProms() 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Core Classes\EF Ext Classes\Till\GeneralBasketE.vb:line 174 中的 CoreTillDAL.GeneralBasket.ApplyBIandBaskDiscounts() 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Plugins Classes\PromClasses 中的 CoreTillDAL.PotAppliedProm.SavePromotionToBasketorItems(Int64 PromIDForThisVal, Boolean ManualActivation, Int64 BasketID, Dictionary`2 UsedBuyItems, Boolean test) \PotentialProms\PotAppliedProm.vb:第 172 行 在 PromPlugin.DPromAutoApplicator.ApplyBestPromotiontoItems() 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\PromDomainPlugin\AutoPromotions\DPromAutoApplicator.vb:line 92 在 PromPlugin.DPromAutoApplicator.CalcandApplyPromsToBasket(GeneralBasketItem NewBasketItem) 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\PromDomainPlugin\AutoPromotions\DPromAutoApplicator.vb:line 59 在 PromPlugin.DPromController.HandleBaskItemAdded(Object o, BaskItemAddedEventArgs e) 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\PromDomainPlugin\AutoPromotions\DPromController.vb:line 53 在 CoreTillDAL.CoreTill.AddBasketItem(Int64 BasketID, Int64 ProductID) 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Core Classes\EF Ext Classes\Till\CoreTill.vb:line 29 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\UnitTests\TestingStoredProcs.vb:line 545 中的 UnitTests.TestingStoredProcs.addBasketItemsToTriggerProm(GeneralBasket Basket, Int64 PromID, DPromController& PromCont) 在 UnitTests.TestBasicTests.TestAllBasicPromsAuto() 在 C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\UnitTests\TestClasses\TestBasicTests.vb:line 265 内部异常:

    我不知道为什么。您可能会看到引用的两种类型:

    PromAppliedPromDisc PromBaskItemDisc

    不是我要附加的类型(GeneralBasketItem),所以我不确定为什么会提到它们。 PromAppliedPromDisc 是 GeneralBasketItem 的导航属性 (FK)。 PrombaskitemDisc 是 PromAppliedPromDisc 的导航属性 (FK)。

    当 EF 尝试将导航属性之一转换为 generalbasketitem 类型时,我也看到了这个问题。

    有人可以帮忙吗?网上没有发现类似的问题。

    【问题讨论】:

      标签: c# .net vb.net entity-framework entity-framework-5


      【解决方案1】:

      我发现清理我的解决方案并重建现在已经摆脱了这个错误。

      我猜它是那些 VS 错误之一。

      【讨论】:

        【解决方案2】:

        当我遇到这个问题时,结果发现我的表中的 Id 字段被设置为标识,但它没有被标记为主键。我修复了它:

        alter TABLE [dbo].[Log] add CONSTRAINT [PK_Id] PRIMARY KEY CLUSTERED 
        (
            [Id] ASC
        )
        

        .. 然后从数据库中重新生成模型。

        【讨论】:

          猜你喜欢
          • 2013-05-15
          • 2017-03-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-22
          • 1970-01-01
          • 1970-01-01
          • 2017-09-23
          相关资源
          最近更新 更多