调用附加实体框架5时出现InvalidCastException

时间:2014-10-22 15:24:19

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

我再次对实体框架有一个非常奇怪的问题。

我想:

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

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

    ''我尝试在每个人的外部和内部进行实验。

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

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

      

    System.InvalidCastException未被用户代码处理     的HResult = -2147467262     Message =无法将“System.Data.Entity.DynamicProxies.PromAppliedPromDisc_052D0BC99A5A9E842B5774E34C71C0ADE6170E70600ADE549AAA5F0EEA48E49F”类型的对象强制转换为“CoreTillDAL.PromBaskItemDisc”。     源= System.Data.Entity的

         

    堆栈跟踪:          在System.Data.Objects.DataClasses.EntityReference 1.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.EntityWrapperWithoutRelationships 1.TakeSnapshotOfRelationships(EntityEntry条目)          at System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity,EntitySet entitySet,String argumentName)          在System.Data.Objects.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity,Boolean doAttach)          在System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity,Boolean relationshipAlreadyExists,Boolean addRelationshipAsUnchanged,Boolean doAttach)          at System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity,Boolean addRelationshipAsUnchanged,Boolean doAttach)          在System.Data.Objects.DataClasses.EntityReference 1.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.InternalSet 1.<> c__DisplayClass2.b__1()          在System.Data.Entity.Internal.Linq.InternalSet 1.ActOnSet(Action action, EntityState newState, Object entity, String methodName) at System.Data.Entity.Internal.Linq.InternalSet 1.Attach(对象实体)          在System.Data.Entity.DbSet 1.Attach(TEntity entity) at CoreTillDAL.PromSetPrice.AdjustBaskItems(HashSet 1 UsedDiscItems)C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ DBPromPlugin1 \ Plugins Classes \ PromAndDisc \ PromSetPriceE.vb:line 60          在CoreTillDAL.GeneralBasket.AdjustBIsforProms()在C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ DBPromPlugin1 \ Core Classes \ EF Ext Classes \ Till \ GeneralBasketE.vb:line 245          在CoreTillDAL.GeneralBasket.ApplyBIandBaskDiscounts()在C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ DBPromPlugin1 \ Core Classes \ EF Ext Classes \ Till \ GeneralBasketE.vb:line 174          at CoreTillDAL.PotAppliedProm.SavePromotionToBasketorItems(Int64 PromIDForThisVal,Boolean ManualActivation,Int64 BasketID,Dictionary`2 UsedBuyItems,Boolean test)in C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ DBPromPlugin1 \ Plugins Classes \ PromClasses \ PotentialProms \ PotAppliedProm.vb:第172行          at C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ PromDomainPlugin \ AutoPromotions \ DPromAutoApplicator.vb中的PromPlugin.DPromAutoApplicator.ApplyBestPromotiontoItems():第92行          在PromPlugin.DPromAutoApplicator.CalcandApplyPromsToBasket(GeneralBasketItem NewBasketItem)中的C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ PromDomainPlugin \ AutoPromotions \ DPromAutoApplicator.vb:第59行          在PromPlugin.DPromController.HandleBaskItemAdded(Object o,BaskItemAddedEventArgs e)中的C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ PromDomainPlugin \ AutoPromotions \ DPromController.vb:第53行          at 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:第29行          在UnitTests.TestingStoredProcs.addBasketItemsToTriggerProm(GeneralBasket Basket,Int64 PromID,DPromController& PromCont)中的C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ UnitTests \ TestingStoredProcs.vb:第545行          在C:\ Users \ neil.clarke \ Documents \ Visual Studio 2012 \ Projects \ Plugins \ UnitTests \ TestClasses \ TestBasicTests.vb中的UnitTests.TestBasicTests.TestAllBasicPromsAuto()中:第265行     InnerException:

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

    PromAppliedPromDisc PromBaskItemDisc

    不是我想要附加的类型(GeneralBasketItem)所以我不确定为什么他们甚至被提到。 PromAppliedPromDisc是GeneralBasketItem的Navigation属性(FK)。 PrombaskitemDisc是PromAppliedPromDisc的导航属性(FK)。

    当EF试图将其中一个导航属性强制转换为generalbasketitem类型时,我也看到了这个问题。

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

    2 个答案:

    答案 0 :(得分:0)

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

    我猜是其中一个VS错误。

    答案 1 :(得分:0)

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

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

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