WCF数据服务+带有实体的实体

时间:2019-08-12 07:57:09

标签: c# wcf wcf-data-services

我正在学习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; }
}

效果很好。如果我开始调试(在浏览器中):

enter image description here

enter image description here

现在让我们说我在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问题,但没有找到任何解决方案让我保留现有实体的枚举。

1 个答案:

答案 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
}