5

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

我们有一个名为 Resident 的实体,以及另一个名为 ResidentExtension 的实体,它以 1 到 (0/1) 的关系扩展了已经很大的 Resident 实体。以下 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_ResidentExtensions_Residents' 的角色 'ResidentExtensions' 具有多重性 1 或 0..1。

它发生在生成代码的设置器中:

    [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;
        }
    }

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

有谁知道如何使这项工作再次以旧方式工作?

4

1 回答 1

1
ResidentExtensions = new ResidentExtensions(),

我认为这条线根本不需要。您正在创建一个新的 residentextensions 对象,该对象没有任何主键并且在数据库中不存在。当上下文尝试保存驻留扩展时,它不能,因为没有设置属性,可能会导致数据库中出现与不可为空字段相关的一些异常。我认为您需要做的是以下几点;

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;

总而言之,由于 Resident 实体与 ResidentExtensions 有 1 - 0,1 的关系;如果右边是0;只需将 ResidentExtensions 属性留空即可;否则初始化适当的 ResidentExtensions 对象并设置相关属性。

于 2012-04-20T06:40:36.660 回答