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

5

我有一个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");

这个工作方式很好,但我无法设置任何枚举属性的值。以下是我的尝试:

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

但是这样做不起作用,我只会在响应中得到null。bSuccess为true,如果我之后调用TryGetValue,它甚至具有预期的值。
然而,在Web响应状态中仍然显示为空。
我尝试了很多变化,但似乎没有任何作用。
你有什么想法我做错了什么吗?
找到解决方案
以下是最终对我有效的方法:
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,但我也尝试过硬编码到列表中的第一个,但它仍然是null

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

所以出了什么问题?我已经在那里设置了断点并且它显示的值是正确的,但是在响应中却得到了null。我也尝试过这个:

var value = new ODataEnumValue( nEnumIntValue.ToString(), enumType.FullName() );
entity.TrySetPropertyValue( col.ColumnName, value );

再次是NULL。非常感谢您的任何帮助!


你缺少一些可能会有帮助的变量。请展示你的 enumTypevalue 的声明。 - Nkosi
添加了一些代码...很乐意回答任何其他问题。 - Porco
1个回答

2

参考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);

1
谢谢您的帮助,我最终解决了问题。不确定您的回答是否有所帮助,但至少它让我有了再次尝试的意愿。 - Porco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接