У меня снова есть очень странная проблема с Entity Framework.
Я хочу:
Отправить хэш объектов для метода Загрузите эти объекты из базы данных Обновите одно из полей в каждом из объектов Сохраните объекты обратно в базу данных, либо сразу, либо по отдельности
Некоторые из моих кодов:
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
StackTrace: at 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) в System.Data.Objects.ObjectContext.AttachSingleObject(IEntityWrapper wrappedEntity, EntitySet entitySet, String аргументName) в System.Data.Objects.DataClasses. RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, булева doAttach) при System.Data.Objects.DataClasses.RelatedEnd.AddGraphToObjectStateManager(IEntityWrapper wrappedEntity, булевы relationshipAlreadyExists, Boolean, Boolean addRelationshipAsUnchanged doAttach) при System.Data.Objects.DataClasses.RelatedEnd.IncludeEntity(IEntityWrapper wrappedEntity, Boolean addRelationshipA sUnchanged, Boolean 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.InternalSet
1. <> 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.InternalSet
1.Attach (объект объекта) в System.Data.Entity.DbSet1.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: строка 60 в CoreTillDAL.GeneralBasket.AdjustBIsforProms() в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPr omPlugin1\Core Classes\EF Ext Classes\Till\GeneralBasketE.vb: строка 245 в CoreTillDAL.GeneralBasket.ApplyBIandBaskDiscounts() в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Core Classes\EF Ext Classes\Till\GeneralBasketE.vb: строка 174 в CoreTillDAL.PotAppliedProm.SavePromotionToBasketorItems(Int64 PromIDForThisVal, логическая ручная активация, Int64 BasketID, словарь'2 UsedBuyItems, булевский тест) в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\DBPromPlugin1\Plugins Classes\PromClasses\PotentialProms\PotAppliedProm.vb: строка 172 в PromPlugin.DPromAutoApplicator.ApplyBestPromotiontoItems() в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\PromDomainPlugin\AutoPromotions\DPromAutoApplicator.vb: строка 92 в PromPlugin.DPromAutoApplicator.CalcandApplyPromsToBasket(GeneralBasketItem NewBasketItem) в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\PromDomainPlugin\AutoPromotions\DPromAutoApplicator.v b: строка 59 в PromPlugin.DPromController.HandleBaskItemAdded(Object o, BaskItemAddedEventArgs e) в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\PromDomainPlugin\AutoPromotions\DPromController.vb: строка 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: строка 29 в UnitTests. TestingStoredProcs.addBasketItemsToTriggerProm(GeneralBasket Basket, Int64 PromID, DPromController & PromCont) в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\UnitTests\TestingStoredProcs.vb: строка 545 в UnitTests.TestBasicTests.TestAllBasicPromsAuto() в C:\Users\neil.clarke\Documents\Visual Studio 2012\Projects\Plugins\UnitTests\TestClasses\TestBasicTests.vb: строка 265 InnerException:
Понятия не имею почему. Поскольку вы можете увидеть два типа ссылок:
PromAppliedPromDisc PromBaskItemDisc
Не тот тип, который я пытаюсь прикрепить (GeneralBasketItem), поэтому я не уверен, почему они даже упоминаются. PromAppliedPromDisc является навигационным свойством (FK) для GeneralBasketItem. PrombaskitemDisc является навигационным свойством (FK) PromAppliedPromDisc.
Я также видел эту проблему, когда EF пыталась применить одно из свойств навигации к типу generalbasketitem.
Может ли кто-нибудь помочь? Я не нашел подобных проблем в Интернете.
Я нашел, что убрал мое решение, и перестройка уже избавилась от этой ошибки.
Я предполагаю, что это один из тех ошибок VS.
Когда я столкнулся с этой проблемой, оказалось, что поле Id в моей таблице было установлено как личность, но оно не было помечено как первичный ключ. Я исправил это с помощью:
alter TABLE [dbo].[Log] add CONSTRAINT [PK_Id] PRIMARY KEY CLUSTERED
(
[Id] ASC
)
.. и затем регенерировать модель из базы данных.