我正在学习WCF数据服务(版本5.6.4)。我找到了一个非常基本的例子。
CodeFirstSampleService.svc.cs的代码:
public class CodeFirstSampleService : EntityFrameworkDataService<BlogContext>
{
public static void InitializeService(DataServiceConfiguration config)
{
config.SetEntitySetAccessRule("*", EntitySetRights.All);
config.SetServiceOperationAccessRule("*", ServiceOperationRights.AllRead);
config.DataServiceBehavior.MaxProtocolVersion = DataServiceProtocolVersion.V3;
AddDataToBlogContext(new BlogContext());
}
private static void AddDataToBlogContext(BlogContext dataSource)
{
var b1 = new Blog() { BlogId = 1, BlogName = "SampleBlog" };
dataSource.Blogs.Add(b1);
dataSource.Posts.Add(new Post()
{
Blog = b1,
BlogId = b1.BlogId,
PostId = 1,
PostName = "Using EntityFrameworkProvider"
});
dataSource.SaveChanges();
}
[WebGet]
public string GetFirstPostName()
{
var context = new BlogContext();
return context.Posts.Select(x => x.PostName).FirstOrDefault();
}
}
DataModel.cs的代码
public class Blog
{
public int BlogId { get; set; }
public string BlogName { get; set; }
public virtual List<Post> Posts { get; set; }
}
public class Post
{
public int PostId { get; set; }
public string PostName { get; set; }
//public ColorEnum Color { get; set; }
//public PostContent Content { get; set; }
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public class BlogContext : DbContext
{
public DbSet<Blog> Blogs { get; set; }
public DbSet<Post> Posts { get; set; }
}
效果很好。如果我开始调试(在浏览器中):
现在让我们说我在Post实体中也有一个枚举。
public class Post
{
public int PostId { get; set; }
public string PostName { get; set; }
public ColorEnum Color { get; set; } // <---- added ENUM here
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
public enum ColorEnum
{
Red,
Green,
Blue
}
在运行时,启动服务时出现错误:类型'Post'上的'Color'属性为'ColorEnum'类型,这不是受支持的原始类型。
我知道:WCF数据服务不支持枚举。
可能有一些解决方法:
,例如,使用enum属性上的[NotMapped]
属性。但就我而言,我不能那样做,因为几年来我已经在生产中使用了EF Code First解决方案,并且有一些枚举,而且我需要它,所以我不能简单地使用实体上的[NotMapped]属性忽略它。
我尝试添加[DataMember]
和[DataContract]
属性,但是它不起作用:仍然收到有关枚举的错误消息。
[DataContract]
public class Post
{
[DataMember]
public int PostId { get; set; }
[DataMember]
public string PostName { get; set; }
public ColorEnum Color { get; set; }
[DataMember]
public int BlogId { get; set; }
public virtual Blog Blog { get; set; }
}
还有哪些其他选择?
请注意,我在上下文中有20个实体,但仅需要其中2个实体即可用于WCF数据服务。而且,只需要将这两个实体设置为“只读”模式即可(无需创建,更新...)。
如何使带有枚举的实体可用于其余应用程序,但如何防止枚举属性在WCF数据服务中出现错误?
也请注意,我已经搜索了与此主题相关的其他SO问题,但没有找到任何解决方案让我保留现有实体的枚举。
答案 0 :(得分:0)
您是否尝试过示例表格MSDN https://social.msdn.microsoft.com/Forums/en-US/e844d7e1-cdf3-4631-82e0-e1a096e91d7e/wcf-enum-datacontract-serialization?forum=wcf
在使用[DataContract]属性装饰枚举类的位置,然后将枚举设置为
[枚举成员]
[DataContract]
public class Car
{
[DataMember]
public string model;
[DataMember]
public CarConditionEnum condition;
}
[DataContract(Name = "CarCondition")]
public enum CarConditionEnum
{
[EnumMember]
New,
[EnumMember]
Used,
[EnumMember]
Rental,
Broken,
Stolen
}