代码之家  ›  专栏  ›  技术社区  ›  JanW

EntityFramework 4.0:InvalidOperationException:违反了多重性约束

  •  5
  • JanW  · 技术社区  · 14 年前

    我们最近将软件升级到.NET 4.0和EF4.0(没有自我跟踪实体)(以前的.NET 3.5 SP1)。现在在以前的工作代码中出现了一个新的异常,我们不理解。

    我们有一个名为“居民”的实体,另一个名为“居民扩展”的实体,它扩展了已经很大的居民实体,并具有1到(0/1)的关系。以下C代码在我们的应用程序中生成一个新实体:

    Residents resident = new Residents()
       {
           IsNewResident = true,
           ResidentImage = Settings.Default.ResidentCardDefaultMaleImage,
           IsActive = true,
           ResidentCanBeDeleted = true,
           ResidentExtensions = new ResidentExtensions(),
           ResidentMasterDataState = EvoState.Error,
           ResidentBasicDataState = EvoState.Error,
           ResidentBenefactorsDataState = EvoState.Error,
       };
    

    此语句后直接引发以下异常:

    违反多重性约束。关系vocura.entitydatamodels.evocuracarehomemanagemententitymodel.fk ou residentextensions ou residents'的角色'residentextensions'具有多重性1或0..1。

    它出现在生成代码的setter中:

        [XmlIgnoreAttribute()]
        [SoapIgnoreAttribute()]
        [DataMemberAttribute()]
        [EdmRelationshipNavigationPropertyAttribute("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel", "FK_ResidentExtensions_Residents", "ResidentExtensions")]
        public ResidentExtensions ResidentExtensions
        {
            get
            {
                return ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value;
            }
            set
            {
                ((IEntityWithRelationships)this).RelationshipManager.GetRelatedReference<ResidentExtensions>("EVOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents", "ResidentExtensions").Value = value;
            }
        }
    

    我找到的唯一解决方案是先提交不带扩展名的常驻实体,然后通过设置外键(residentid)创建resident extension,并将其添加到上下文中,然后再次提交。但这不是以前的工作方式。

    有人知道如何使这项工作重新回到原来的方式吗?

    1 回复  |  直到 12 年前
        1
  •  1
  •   daryal    12 年前
    ResidentExtensions = new ResidentExtensions(),
    

    我认为根本不需要这条线。您正在创建一个新的ResidenceXTensions对象,该对象没有任何主键,并且在数据库中不存在。当Context尝试保存ResidenceXTensions时,由于未设置任何属性,因此无法保存,这可能导致数据库中与不可为空字段相关的某些异常。我认为你需要做的是:

    Residents resident = new Residents()
       {
           IsNewResident = true,
           ResidentImage = Settings.Default.ResidentCardDefaultMaleImage,
           IsActive = true,
           ResidentCanBeDeleted = true,
           ResidentMasterDataState = EvoState.Error,
           ResidentBasicDataState = EvoState.Error,
           ResidentBenefactorsDataState = EvoState.Error,
       };
    //Now you need to either initialize a residentextextensions entity
    // with proper values, or just do not relate it with the resident entity.
    ResidentExtensions temp = new ResidentExtensions();
    temp.PropertyA = 3;
    //etc.
    resident.ResidentExtensions = temp;
    

    综上所述,由于常驻实体与ResidenceXTensions有1-0,1关系;如果右侧为0,则只保留ResidenceXTensions属性为空;否则初始化适当的ResidenceXTensions对象并设置相关属性。