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)
在其他情况下,您会遇到此错误,包括删除通过使用.Include
扩展方法获得的实体时。
关键在于,如果将关系定义为,ICollection<T>
那么Entity Framework将通过使用数组来实现该关系。但是,您可以从多种有效的关系类型中进行选择,包括类型ISet<T>
和IList<T>
。使用其中任何一种来定义您的关系都可以解决问题。
我插入了以下图表:
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,则添加操作将起作用。
如果我设法改变它的序列化方式,我会告诉你。
归档时间: |
|
查看次数: |
8147 次 |
最近记录: |