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

时间:2017-03-17 11:35:10

标签: 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; }
    }

我希望当我使用任何API发送此对象时,它应该在JSON中提供属性名称,就像DataMember中提到的那样,但它没有发生。对于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);
            }
        }

2 个答案:

答案 0 :(得分:4)

{p} DataMemberAttributeJson.NETDataContractJsonSerializer忽略,除非[DataContract]也适用于该类型本身。来自docs

  

将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; }
}

请注意,数据合同序列化为opt-in,因此您现在还必须使用Id标记Children[DataMember]

答案 1 :(得分:0)

请参阅.NET NewtonSoft JSON deserialize map to a different property name

[JsonProperty("new name")]
public string SomeColumn { get; set; }

但是,这会假设您使用Newtonsoft作为JSON序列化程序。如果您将其替换为另一个,则必须使用特定于该序列化程序的属性。