DataMember Name 属性在实体框架中不起作用

Dip*_*pak 1 c# serialization entity-framework-6

我有这样的Dto:

public class OptimizationNodeDto : IModelWithId
    {        
        public int Id { get; set; }

        [DataMember(Name = "parentId")]
        public int? ParentOptimizationNodeId { get; set; }

        [DataMember(Name = "name")]
        public string Text { get; set; }

        [DataMember(Name = "opened")]
        public bool IsOpened { get; set; }

        [DataMember(Name = "selected")]
        public SelectedStates SelectedState { get; set; }

        public List<OptimizationNodeDto> Children { get; set; }
    }
Run Code Online (Sandbox Code Playgroud)

我希望当我使用任何 API 发送这个对象时,它应该像 DataMember 中提到的那样在 JSON 中给出属性名称,但它没有发生。对于 ex.ParentOptimizationNodeId 应该作为 JSON 结果中的 parentId。我在这里发送 Dto:

 [Route("{roleId}/Optimizations")]
        [HttpPost]
        public IHttpActionResult GetOptimizationList([FromUri]int roleId, [FromBody] FilterDto filter)
        {
            try
            {
                var groupManBo = _serviceLocator.Resolve<IRoleManagerBo>();
                return Ok(groupManBo.GetOptimization(roleId, this.ViewboxUser, filter));
            }
            catch (Exception ex)
            {
                return this.HandleError(ex);
            }
        }
Run Code Online (Sandbox Code Playgroud)

dbc*_*dbc 6

DataMemberAttributeJson.NET忽略,DataContractJsonSerializer除非[DataContract]也应用于类型本身。从文档

将 DataMemberAttribute 属性与 DataContractAttribute 结合应用以标识属于数据协定一部分的类型的成员。

因此,您的 DTO 必须如下所示:

[DataContract]
public class OptimizationNodeDto : IModelWithId
{
    [DataMember]
    public int Id { get; set; }

    [DataMember(Name = "parentId")]
    public int? ParentOptimizationNodeId { get; set; }

    [DataMember(Name = "name")]
    public string Text { get; set; }

    [DataMember(Name = "opened")]
    public bool IsOpened { get; set; }

    [DataMember(Name = "selected")]
    public SelectedStates SelectedState { get; set; }

    [DataMember]
    public List<OptimizationNodeDto> Children { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

需要注意的是数据契约序列化选入,所以你现在也必须标记IdChildren使用[DataMember]