如何在动态Odata对象上设置枚举值

时间:2016-05-19 15:08:57

标签: c# asp.net-web-api odata

我有一个ODATA服务,它返回一个类似于此的动态对象:https://blogs.msdn.microsoft.com/leohu/2013/11/04/typeless-entity-object-support-in-webapi/

当我填充对象属性时,我会这样做:

 var entityCategory = new EdmEntityObject(entityType);
 bool bSuccess = entityCategory.TrySetPropertyValue("Name", "Category 1");

这样可以正常工作,但我无法设置任何Enum属性的值。以下是我尝试过的内容:

var edmValue= new EdmEnumValue( new EdmEnumTypeReference( enumType, true ), value );
bool bSuccess = entityCategory.TrySetProperty( "Status", edmValue );

但这并不起作用,我只是在响应中得到null。 bSuccesstrue,如果我之后致电TryGetValue,它甚至具有预期值。

但是,在Web响应状态中仍显示为NULL。

我尝试了很多变化,但似乎没有任何效果。

任何想法我做错了什么?

找到解决方案

这是最终对我有用的:

var oEnumObject = new EdmEnumObject( enumType, strEnumValue );
entity.TrySetPropertyValue( fieldName, oEnumObject );

不确定为什么我需要使用EdmEnumObject,但它似乎有效。它实际上将接受并显示strEnumValue的任何字符串值。

没有这项工作

更多信息:

当我向数据模型添加枚举时,我会执行以下操作:

var enumType = new EdmEnumType( Namespace, "Status", EdmPrimitiveTypeKind.Int64, false);
enumType.AddMember( "Active", 0);
..
AddProperty( EdmStructuralProperty( this, field.Name, new EdmEnumTypeReference( thisEnum, bIsNullable ) )

我在这里缓存enumType的值,稍后在我填充时使用它(在上面的代码中)。因此,我认为enumType是有效的。至于value,我有一些代码可以选择正确的EdmEnumMember,但我也尝试过将其编码到列表中的第一个代码,它仍然是{{1} }:

null

那到底是什么?我在那里遇到了一个断点,它似乎有正确的值,但我在响应中得到null。我也试过这个:

var edmValue = new EdmEnumValue( new EdmEnumTypeReference( enumType, true ), enumType.Members.First() );

再次,NULL。非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

引用following test on github敌人EdmEnumType

您应该看看如何创建成员并将成员添加到enumType ...

//make sure you enum type is not nullable
var enumType = new EdmEnumType(Namespace, "Status", EdmCoreModel.Instance.GetInt32(false).PrimitiveDefinition(), false);

//enum members are made up of constants
var enumMember = enumType.AddMember("Active", new EdmIntegerConstant(0));

//You should also not make the value nullable
var edmValue = new EdmEnumValue(new EdmEnumTypeReference(enumType, false), enumMember);