我正在尝试使用POCO数据模型手动构建一个enum
数据服务,但我不知道如何正确地公开POCO值。假设一个简单的模型,比如:
public class Order
{
public int ID {get; set;}
public string Description {get; set;}
public OrderStatus Status {get; set;}
}
public enum OrderStatus
{
New,
InProcess,
Complete
}
如何通过OrderStatus
数据服务公开属性中的有价值信息?
如果不执行任何操作,数据服务将生成运行时错误(枚举是无效属性)。我所看到的至少可以解决错误的唯一答案是将enum
属性标记为忽略,例如:
[System.Data.Services.IgnoreProperties("Status")]
public class Order ...
这是可行的,但它迫使您从服务层“省略”有价值的信息。在WCF数据服务中是否有使用枚举值的其他选项?
编辑:请注意,这是Astoria数据服务(也称为Astoria)。这不是原始的WCF服务,在这种情况下,答案会更清楚。
发布于 2010-08-26 08:59:55
WCF Data Services目前不支持枚举( OData协议也不支持枚举)。典型的解决方法是使用字符串和常量值,或整数和常量值。
发布于 2010-08-26 22:07:26
也许我们可以用下面的解决方法来“欺骗”它:
[System.Data.Services.IgnoreProperties("Status")]
public class Order
{
public int ID {get; set;}
public string Description {get; set;}
public OrderStatus Status {get; set;}
public int StatusValue
{
get
{
return (int)this.Status;
}
set
{
// Add validation here
this.Status = (OrderStatus)value;
}
}
}
public enum OrderStatus
{
New,
InProcess,
Complete
}
发布于 2010-08-28 05:55:57
作为后续,“包装器”方法最终是有效的。实际上,编写了一个小类来包装数据服务中的enum
并返回原始的int
值:
[IgnoreProperties("EnumValue")]
public class OrderStatusWrapper
{
private OrderStatus _t;
public int Value
{
get{ return (int)_t; }
set { _t = (OrderStatus)value; }
}
public OrderStatus EnumValue
{
get { return _t; }
set { _t = value; }
}
public static implicit operator OrderStatusWrapper(OrderStatus r)
{
return new OrderStatusWrapper { EnumValue = r };
}
public static implicit operator OrderStatus(OrderStatusWrapper rw)
{
if (rw == null)
return OrderStatus.Unresolved;
else
return rw.EnumValue;
}
}
这在很大程度上是基于为解决EF4的enum
限制而给出的建议:
http://blogs.msdn.com/b/alexj/archive/2009/06/05/tip-23-how-to-fake-enums-in-ef-4.aspx
希望这项技术对其他人有所帮助。
https://stackoverflow.com/questions/3570249
复制相似问题