实体框架“无法从类型为* []的固定大小的数组中删除项目”

Jam*_*mes 5 .net silverlight wcf entity-framework

我正在使用EntityFramework来保存我的实体。

我的问题是,当通过WCF发送在Silverlight中构造的实体进行持久化时,出现错误“无法从类型为'CarterShop.Commerce.Entities.ManufacturedItemRequirement []'的固定大小的数组中删除项目。

我正在插入一个具有ManufacturedItemRequirements ICollection的实体(ManufacturedItem)。实体框架应该允许我将其作为POCO对象“添加”到DbContext并坚持下去,但是由于某种原因它抱怨集合。

有人遇到过这个问题吗?基本上我不知道它在抱怨什么。错误来自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
Run Code Online (Sandbox Code Playgroud)

我基本上是在做:

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();
Run Code Online (Sandbox Code Playgroud)

Kir*_*oll 6

在其他情况下,您会遇到此错误,包括删除通过使用.Include扩展方法获得的实体时。

关键在于,如果将关系定义为,ICollection<T>那么Entity Framework将通过使用数组来实现该关系。但是,您可以从多种有效的关系类型中进行选择,包括类型ISet<T>IList<T>。使用其中任何一种来定义您的关系都可以解决问题。


Jam*_*mes 0

我插入了以下图表:

ManufacturedItem has many ManufacturedItemRequirements.
ManufacturedItemRequirement has a ManufacturedItem.
ManufacturedItemRequirement has a StockItemDefinition.
Run Code Online (Sandbox Code Playgroud)

这已经很满足了。然而我忽略了图表的一部分:

StockItemDefinition has many ManufacturedItemRequirements.
Run Code Online (Sandbox Code Playgroud)

因为我没有用新的 ManufacturedItemRequirement 填充此引用数组,所以它不起作用。

我确实认为我不必指定这一点,因为这种关系是隐式的而不是显式的关系。我认为不应为这些属性生成空数组,而应该生成 NULL。如果我将子数组设置为 NULL,则添加操作将起作用。

如果我设法改变它的序列化方式,我会告诉你。