Я работаю с OData, с чем я не слишком знаком. Когда OData присоединяет сущность к контексту в классе DataServiceContext , они устанавливают свойство .Identity
с использованием ODataResourceMetadataBuilder.
ODataResourceMetadataBuilder entityMetadataBuilder = this.GetEntityMetadataBuilderInternal(descriptor);
descriptor.EditLink = entityMetadataBuilder.GetEditLink();
descriptor.Identity = entityMetadataBuilder.GetId();
Это проходит через серию классов OData, начинающихся с ConventionalODataEntityMetadataBuilder.GetId () , который в конечном итоге попадает туда, где создается CompositeKey в OData DataServiceUrlKeyDelimiter
internal void AppendKeyExpression(IEdmStructuredValue entity, StringBuilder builder)
{
Debug.Assert(entity != null, "entity != null");
Debug.Assert(builder != null, "builder != null");
IEdmEntityTypeReference edmEntityTypeReference = entity.Type as IEdmEntityTypeReference;
if (edmEntityTypeReference == null || !edmEntityTypeReference.Key().Any())
{
throw Error.Argument(ErrorStrings.Content_EntityWithoutKey, "entity");
}
// Problem occurs here - edmEntityTypeReference.Key() has the keys in the wrong order.
this.AppendKeyExpression(edmEntityTypeReference.Key().ToList(), p => p.Name, p => GetPropertyValue(entity.FindPropertyValue(p.Name), entity.Type), builder);
}
Ключи определены в моем классе с помощью аннотаций ключей
public class MyClass
{
[Key, Column(Order = 0)]
public Guid CompositeKeyB { get; set; }
[Key, Column(Order = 1)]
public Guid CompositeKeyA { get; set; }
}
Обратите внимание, что клавиши расположены в алфавитном порядке назад.
Когда приведенный выше код запускается для установки поля .Identity
, он дает мне ключи в алфавитном порядке, а не в порядке, указанном в аннотации данных.
Это проблема, потому что когда объект извлекается, ключи располагаются в правильном порядке, поэтому у него есть свойство .Identity
, и он рассматривается как отдельный экземпляр, чем прикрепленный экземпляр. Это означает, что он не обновляет присоединенную сущность новыми данными, а также что вторая копия сущности создается в контексте.
Есть ли простой способ исправить это, или я застрял с написанием собственного кода, чтобы получить ключи в правильном порядке с помощью отражения? В настоящее время я не вижу способа найти значение Order в свойстве IEdmStructuralProperty
, которое возвращается из IEdmEntityTypeReference.Key()
.