Entity Framework 'Элемент нельзя удалить из массива фиксированного размера типа * []' - PullRequest
4 голосов
/ 05 апреля 2011

Я использую EntityFramework для сохранения своих сущностей.

Проблема, с которой я сталкиваюсь, заключается в том, что при отправке сущности, созданной в Silverlight, через WCF для получения доступа я получаю сообщение об ошибке «Элемент нельзя удалить из фиксированнойsize Массив типа 'CarterShop.Commerce.Entities.ManufacturedItemRequirement []'.

Я вставляю сущность (ManufacturedItem), которая имеет ICollection из ManufacturedItemRequirements.Entity Framework должен позволить мне просто «добавить» это в DbContext как объект POCO и сохранить его, но по какой-то причине он жалуется на коллекцию.

Кто-нибудь сталкивался с этой проблемой раньше?В основном я не знаю, на что это жалуется.Ошибка происходит изнутри System.Data:

at System.Data.Objects.Internal.PocoPropertyAccessorStrategy.CollectionRemove(RelatedEnd relatedEnd, Object value)
   at System.Data.Objects.Internal.EntityWrapper`1.CollectionRemove(RelatedEnd relatedEnd, Object value)
   at System.Data.Objects.DataClasses.EntityCollection`1.RemoveFromObjectCache(IEntityWrapper wrappedEntity)
   at System.Data.Objects.ObjectStateManager.DegradePromotedRelationships()
   at System.Data.Objects.DataClasses.RelationshipManager.AddRelatedEntitiesToObjectStateManager(Boolean doAttach)
   at System.Data.Objects.ObjectContext.AddObject(String entitySetName, Object entity)
   at System.Data.Entity.Internal.Linq.InternalSet`1.<>c__DisplayClass5.<Add>b__4()
   at System.Data.Entity.Internal.Linq.InternalSet`1.ActOnSet(Action action, EntityState newState, Object entity, String methodName)
   at System.Data.Entity.Internal.Linq.InternalSet`1.Add(Object entity)
   at System.Data.Entity.DbSet`1.Add(TEntity entity)
   at Commerce.Model.Repositories.RepositoryBase`1.Add(T entity) in C:\OclProjects 4.1\CarterShop\CarterShop.Commerce.Model\Repositories\RepositoryBase.cs:line 28
   at CarterShop.Commerce.Services.Implementation.StockItemService.CreateManufacturedItem(ManufacturedItem manufactedItem, Boolean createDefinitionAswell) in C:\OclProjects 4.1\CarterShop\CarterShop.Commerce.Services\Implementation\StockItemService.cs:line 137

Я в основном делаю:

ManufacturedItem item = new ManufacturedItem();
item.ManufacturedItemRequirements.Add(new ManufacturedItemRequirement() { Quantity = 1; DefinitionId = 5 });

// Send to WCF...

Context.ManufacturedItems.Add(item); // Error thrown here.
Context.SaveChanges();

Ответы [ 4 ]

4 голосов
/ 25 марта 2014

В других ситуациях вы можете столкнуться с этой ошибкой, в том числе при удалении сущностей, полученных с использованием методов расширения .Include.

Ключ заключается в том, что если отношение определяется как ICollection<T>, то Entity Framework материализует отношение с помощью массива. Однако есть много допустимых типов для отношений, включая типы ISet<T> и IList<T>. Использование любого из них для определения ваших отношений решит проблему.

2 голосов
/ 30 октября 2013

причина этого в том, что созданные классы EF по умолчанию обрабатываются как HashSet, а отношение обозначается как тип ICollection. Если вы откроете свой сгенерированный класс в конструкторе, для списка связанных объектов добавьте метод ToList () следующим образом: public ResultSet () { this.Results = new HashSet (). ToList (); // добавили ToList () ..... }

тогда где-то ниже вы увидите, где оно определено как публичное виртуальное свойство, например: публичные виртуальные результаты ICollection {get; задавать; } Изменить с ICollection на Список

... это решило аналогичную проблему, с которой я столкнулся ... однако вы должны принять к сведению, что ваш код будет перезаписан, если вы заново сгенерируете класс / модель из базы данных

0 голосов
/ 18 марта 2015

Для умножения на умножение сопоставления ассоциаций сущностей:

item *>|------|<* ManufacturedItemRequirement

Затем будет создано свойство навигации как в сущности элемента, так и в ManufacturedItemRequirement с именем item.ManufacturedItemRequirements и ManufacturedItemRequirement.items.

Theтолько что созданный ManufacturedItemRequirement должен быть вставлен в таблицу сущностей в первую очередь, чтобы получить идентификатор

var mf = new ManufacturedItemRequirement() { Quantity = 1; DefinitionId = 5 };
Context.ManufacturedItemRequirement.Add(mf);
Context.SaveChanges();
//then add the association to item
item.ManufacturedItemRequirements.Add(mf);
Context.SaveChanges();

. Если вы проверите структуру базы данных, то будет создана таблица сопоставления идентификаторов для записи связи между Предметами и ManufacturedItemRequirements.Идентификатор объекта сущности необходим для установления ассоциации.

0 голосов
/ 06 апреля 2011

Я вставлял следующий график:

ManufacturedItem has many ManufacturedItemRequirements.
ManufacturedItemRequirement has a ManufacturedItem.
ManufacturedItemRequirement has a StockItemDefinition.

Это было удовлетворено.Однако я просматривал одну часть графика:

StockItemDefinition has many ManufacturedItemRequirements.

Поскольку я не заполнял этот ссылочный массив новым ManufacturedItemRequirement, он бы не работал.

Думаю, яне должно указывать это, так как это отношение является неявным, а не явным.Я думаю, вместо того, чтобы генерировать пустой массив для этих свойств, он должен генерировать NULL.Если я установлю для дочернего массива значение NULL, операция Add сработает.

Я сообщу вам, если мне удастся изменить способ его сериализации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...