EntityFramework 4.0: InvalidOperationExeception: ограничение множественности нарушено - PullRequest
5 голосов
/ 17 июля 2010

Мы недавно обновили наше программное обеспечение до .NET 4.0 и EF 4.0 (без объектов самоконтроля) (ранее .NET 3.5 SP1).Теперь в прежнем рабочем коде возникает новое исключение, которое мы не понимаем.

У нас есть сущность с именем Resident и другая сущность с именем ResidentExtension, которая расширяет и без того большой объект Resident с 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,
   };

Следующее исключение возникает непосредственно после этого оператора:

Нарушено ограничение множественности.Роль ResidentExtensions отношения VOCURA.EntityDataModels.EvocuraCarehomeManagementEntityModel.FK_ResidentExtensions_Residents 'имеет кратность 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;
        }
    }
1014 * Единственное решение, которое я нашел, - это сначала отправить объект-резидент без расширения, а затем создать ResidentExtension с установкой внешнего ключа (ResidentID), добавить его в контекст и снова отправить.Но это не так, как раньше.

Кто-нибудь знает, как заставить эту работу снова работать по-старому?

1 Ответ

1 голос
/ 20 апреля 2012
ResidentExtensions = new ResidentExtensions(),

Я думаю, что эта строка вообще не нужна. Вы создаете новый объект 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;

В итоге, поскольку объект-резидент имеет отношение 1 - 0,1 к ResidentExtensions; если правая сторона равна 0; просто оставьте свойство ResidentExtensions пустым; в противном случае инициализируйте правильный объект ResidentExtensions и установите соответствующее свойство.

...