违反了多重约束

时间:2013-05-23 14:33:57

标签: entity-framework ef-code-first entity-framework-5 code-first

我有两个人:

  • ClaimDetail(int ID,IList ClaimDetailStatus,other ...)
  • ClaimDetailStatus(int ID,ClaimDetailClaimDetail,other ...)

配置:

modelBuilder.Entity<ClaimDetailStatus>()
    .HasRequired<ClaimDetail>(x => x.ClaimDetail)
    .WithMany(x => x.ClaimDetailStatus)
    .HasForeignKey(x => x.ClaimDetailID).WillCascadeOnDelete(true);

modelBuilder.Entity<ClaimDetail>()
    .HasMany<ClaimDetailStatus>(x => x.ClaimDetailStatus)
    .WithRequired(x => x.ClaimDetail)
    .HasForeignKey(x => x.ClaimDetailID).WillCascadeOnDelete(true);

当我在编写代码时,运行&amp;调试它一切都很好但是当我想保存所有内容时它抛出异常:

System.InvalidOperationException was unhandled by user code
  HResult=-2146233079
  Message=Multiplicity constraint violated. The role 'ClaimDetailStatus_ClaimDetail_Target' of the relationship 'EPer.DataAccess.ClaimDetailStatus_ClaimDetail' has multiplicity 1 or 0..1.
  Source=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.DataClasses.RelatedEnd.AddEntityToObjectStateManager(IEntityWrapper wrappedEntity, Boolean doAttach)
       at 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)
       at System.Data.Objects.DataClasses.EntityCollection`1.Include(Boolean addRelationshipAsUnchanged, Boolean doAttach)
       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.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 EPer.DataAccess.ObjectSetAdapter`1.AddObject(T entity) in c:\KBData\_repo\Intranet\Apps\EOffice\EPer\EPer.Dal\ObjectSetAdapter.cs:line 41
       at EPer.BusinessLogic.DomainServices.ClaimComponent.CreateClaim(Claim claimModel, UserClaim uc) in c:\KBData\_repo\Intranet\Apps\EOffice\EPer\EPer.BusinessLogic\DomainServices\ClaimComponent.cs:line 28
       at EPer.BusinessLogic.ApplicationServices.ClaimService.CreateClaim(Claim claimModel, IEnumerable`1 autoApprovers, UserClaim uc) in c:\KBData\_repo\Intranet\Apps\EOffice\EPer\EPer.BusinessLogic\ApplicationServices\ClaimService.cs:line 180
       at EPer.BusinessLogic.ApplicationServices.ClaimService.CreateClaim(Claim claimModel, IEnumerable`1 autoApprovers) in c:\KBData\_repo\Intranet\Apps\EOffice\EPer\EPer.BusinessLogic\ApplicationServices\ClaimService.cs:line 113
       at EPer.BusinessLogic.ApplicationServices.ClaimService.CreateClaim(Claim claimModel) in c:\KBData\_repo\Intranet\Apps\EOffice\EPer\EPer.BusinessLogic\ApplicationServices\ClaimService.cs:line 99
       at EPer.Areas.Claims.Controllers.ClaimController.Create(SingleClaim m) in c:\KBData\_repo\Intranet\Apps\EOffice\EPer\EPer\Areas\Claims\Controllers\ClaimController.cs:line 107
       at lambda_method(Closure , ControllerBase , Object[] )
       at System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters)
       at System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters)
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass42.<BeginInvokeSynchronousActionMethod>b__41()
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass37.<>c__DisplayClass39.<BeginInvokeActionMethodWithFilters>b__33()
       at System.Web.Mvc.Async.AsyncControllerActionInvoker.<>c__DisplayClass4f.<InvokeActionMethodFilterAsynchronously>b__49()
  InnerException: 

生成的关联:

<Association Name="ClaimDetailStatus_ClaimDetail">
  <End Role="ClaimDetailStatus_ClaimDetail_Source" Type="Self.ClaimDetailStatus" Multiplicity="*" />
  <End Role="ClaimDetailStatus_ClaimDetail_Target" Type="Self.ClaimDetail" Multiplicity="1">
    <OnDelete Action="Cascade" />
  </End>
  <ReferentialConstraint>
    <Principal Role="ClaimDetailStatus_ClaimDetail_Target">
      <PropertyRef Name="ID" />
    </Principal>
    <Dependent Role="ClaimDetailStatus_ClaimDetail_Source">
      <PropertyRef Name="ClaimDetailID" />
    </Dependent>
  </ReferentialConstraint>

我检查了生成的可视化实体数据模型,一切看起来还不错。

这里发生了什么?     

编辑修正

我有第三个实体:索赔;如果一个Claim只包含一个ClaimDetail,一切正常,但如果它包含2 ClaimDetail,则抛出上述异常。

2 个答案:

答案 0 :(得分:3)

问题是我在每个ClaimDetail的ClaimDetailStatus集合中添加了第一个ClaimDetailStatus的相同实例。如果我正在添加不同的实例(在循环细节中.ClaimDetailStatus.Add(new ...))一切正常。

答案 1 :(得分:0)

ClaimDetail (int ID, IList ClaimDetailStatus, other...)
ClaimDetailStatus (int ID, ClaimDetailClaimDetail, other...)

当我从db获取实体,然后尝试保存已编辑的实体时,就会发生这种情况。

尝试

Detached ClaimDetail.ClaimDetailStatus.ClaimDetailClaimDetail,
ClaimDetail.ClaimDetailStatus,
ClaimDetail

然后保存,它有效。