Составной ключ в объекте не отражен в методе Equals

Дан объект "MultipleKeysEntity" с двумя ключами keyA и keyB.

KeyA имеет тип Enumeration; KeyB имеет тип guid.

Сгенерированный код для метода Equals благодаря производителю спецификации не принимает во внимание keyA. Это нормальное поведение?

<cf:entity name="MultipleKeysEntity" defaultUsePersistenceDefaultValue="false" baseEqualsOverride="false" setType="List" namespace="Project.Namespace" >
    <cf:property name="keyA" persistenceIdentity="false" key="true" typeName="{0}.Enumeration" />
    <cf:property name="keyB" key="true" />
    <cf:property name="property" typeName="decimal" /></cf:entity> 

<cf:enumeration name="Enumeration" namespace="Project.Namespace" >
<cf:enumerationValue name="ONE" />
<cf:enumerationValue name="TWO" /></cf:enumeration>

Под сгенерированным кодом

public virtual bool Equals(Project.Namespace.MultipleKeysEntity multipleKeysEntity)
    {
        if ((multipleKeysEntity == null))
        {
            return false;
        }
        if ((this.keyB == CodeFluentPersistence.DefaultGuidValue))
        {
            return base.Equals(multipleKeysEntity);
        }
        return (this.keyB.Equals(multipleKeysEntity.keyB) == true);
    }

Спасибо за Ваш ответ,

РЕДАКЦИЯ от 29.08.2016

После установки для атрибута checkDefaultValue значения true метод Equals использует свойство, как и ожидалось. Но первое значение перечислений считается "недопустимым" значением.

В частности, метод MultipleKeysEntityCollection::baseAdd() не позволяет мне использовать значение "ONE"

protected virtual int BaseAdd(WcfServices.Model.Association.MultipleKeysEntity multipleKeysEntity)
        {
            if ((multipleKeysEntity == null))
            {
                throw new System.ArgumentNullException("multipleKeysEntity");
            }
            if (((multipleKeysEntity.keyA == WcfServices.Model.Association.Enumeration.ONE) 
                        || (multipleKeysEntity.keyB.Equals(CodeFluentPersistence.DefaultGuidValue) == true)))
            {
                CodeFluent.Runtime.CodeFluentRuntimeException.Throw("invalidEntityKey", "keyA, keyB", "multipleKeysEntity", "WcfServices.Model.Association.MultipleKeysEntity");
            }
            int localAdd = this.BaseList.Count;
            this.BaseList.Add(multipleKeysEntity);
            this.OnCollectionChanged(new CodeFluent.Runtime.Utilities.IndexedCollectionChangeEventArgs(System.ComponentModel.CollectionChangeAction.Add, multipleKeysEntity, localAdd));
            this.OnListChanged(new System.ComponentModel.ListChangedEventArgs(System.ComponentModel.ListChangedType.ItemAdded, localAdd));
            return localAdd;
        }

Код метода Equals приведен ниже:

public virtual bool Equals(WcfServices.Model.Association.MultipleKeysEntity multipleKeysEntity)
        {
            if ((multipleKeysEntity == null))
            {
                return false;
            }
            if (((this.keyA == WcfServices.Model.Association.Enumeration.ONE) 
                        || (this.keyB == CodeFluentPersistence.DefaultGuidValue)))
            {
                return base.Equals(multipleKeysEntity);
            }
            return ((this.keyA.Equals(multipleKeysEntity.keyA) && this.keyB.Equals(multipleKeysEntity.keyB)) 
                        == true);
        }

person Olivier ROMAND    schedule 26.08.2016    source источник


Ответы (1)


По умолчанию свойства перечисления составного ключа не используются для равного сравнения. Вы можете указать производителю спецификации использовать это свойство, установив атрибут xml cfom:checkDefaultValue="true":

<cf:property name="Id2" cfom:checkDefaultValue="true" />
person meziantou    schedule 29.08.2016
comment
Как добавлено в EDIT, это не позволяет мне использовать значение ONE моего перечисления в качестве допустимого значения. - person Olivier ROMAND; 29.08.2016
comment
Обычной практикой является добавление значения по умолчанию в перечисление (Неизвестно/Не указано/Нет/...). Дополнительная информация о объектах CodeFluent и значениях по умолчанию: stackoverflow.com/a/35790190/2996339 - person meziantou; 29.08.2016