Я пытаюсь вручную создать службу данных WCF, используя модель данных POCO, и не могу понять, как правильно выставлять значения enum
. Предполагая простую модель, подобную следующей:
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
через службу данных OData WCF?
Если вы ничего не делаете, служба данных генерирует ошибку времени выполнения (enum является недействительным свойством). Единственный ответ, который я видел, что, по крайней мере, устраняет ошибку, это пометить свойство enum
как игнорируемое, например:
[System.Data.Services.IgnoreProperties("Status")]
public class Order ...
Это работает, но заставляет вас «опускать» ценную информацию из сервиса слой. Существуют ли другие варианты работы со значениями перечисления в службах данных WCF?
РЕДАКТИРОВАТЬ: Обратите внимание, что это Службы данных WCF (он же Astoria). Это не необработанные сервисы WCF, и в этом случае ответы более ясны.
Вы должны сделать enum контрактом данных.
См. пример здесь: http://consultingblogs.emc.com/merrickchaffer/archive/2007/04/03/Passing-Enum-values-into-WCF-Service-operations.aspx
[Редактировать] По-видимому, это не всегда так, как показано здесь: Совместное использование Enum со службой WCF
Возможно, мы можем "обмануть" его с помощью следующего обходного пути:
[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
}
Предполагая, что сериализация Datacontratt, как так:
[DataContract]
public class Order
{
[DataMember]
public int ID {get; set;}
[DataMember]
public string Description {get; set;}
[DataMember]
public OrderStatus Status {get; set;}
}
[DataContract]
public enum OrderStatus
{
[EnumMember]
New,
[EnumMember]
InProcess,
[EnumMember]
Complete
}