如何注释DTO以启用不区分大小写的映射?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何注释DTO以启用不区分大小写的映射?相关的知识,希望对你有一定的参考价值。

如何在不知道源列名称的情况下将数据读入具体模型?

我正在从表存储中读取数据:

public static IEnumerable<Translation> GetTranslations(string sourceParty, string destinationParty)
{
    var acc = CloudStorageAccount.Parse(Environment.GetEnvironmentVariable("RRRCacheStorageConnection"));
    var tableClient = acc.CreateCloudTableClient();
    var table = tableClient.GetTableReference(Environment.GetEnvironmentVariable("RRRTableCache"));

    TableQuery<Translation> rangeQuery = new TableQuery<Translation>().Where(
        TableQuery.CombineFilters(
            TableQuery.GenerateFilterCondition(Environment.GetEnvironmentVariable("SourcePartyColumnName"), QueryComparisons.Equal, sourceParty),
            TableOperators.And,
            TableQuery.GenerateFilterCondition(Environment.GetEnvironmentVariable("DestinationPartyColumnName"), QueryComparisons.Equal, destinationParty)));

    return table.ExecuteQuery(rangeQuery);
}

然后我转入一个具体的模型,看起来像这样:

public class Translation : TableEntity
{
    public Translation()
    {

    }
    public string translatefrom { get; set; }
    public string translateto { get; set; }
    public string TranslationId { get; set; }
    public string FieldType { get; set; }
    public string sourceparty { get; set; }
    public string destinationparty { get; set; }
}

但是,如果Azure中的源表具有名为TranslateFrom的字段而不是translatefrom(如上面的类中所定义),则不会读取数据。

如何在不知道源列名称的情况下将数据读入具体模型?

答案

您应该遵循C#中的UpperCamelCase和JSON / JS的lowerCamelCase的约定

因此,像你这样的混合约定是一个坏主意,只会导致像Entity这样的库出现问题,导致可读性方面的其他用户出现问题,一旦你开始做API调用就会完全混乱。

更新您的表实体以使用所有UpperCamelCase。这同样适用于DTO,因为JSON Convert将在javascript的序列化和解除序列化期间自动应用lowerCamelCase,同时将代码保留在C#约定中。

有一个选项可以告诉实体忽略套管......但我宁愿向你提供一个外部意见,不要改变那些由聪明人设置的惯例......而是修复你的方法,让每个人都能轻松生活这条线。

假设这种标准的C#编写方式(UpperCase)

public class TestClass {
   public string TranslateFrom { get; set; }
}

并通过MVC或API中的ActionResult返回它

public ActionResult SomeActionMethod() {
  return Json(new TestClass(){TranslateFrom="z-axis"});
}

JSON(属性命名约定)将是lowerCase

{ "translateFrom" : "z-axis" }

而另一种方式。您可以将大写或小写发送到C#MVC / API,Newtonsoft.JSON将会运行。但是您应该坚持使用始终为lowerCase属性的JavaScript约定。

你的课应该是这样的。

public class Translation : TableEntity
{
    public string TranslateFrom { get; set; }
    public string TranslateTo { get; set; }
    public string TranslationId { get; set; }
    public string FieldType { get; set; }
    public string SourceParty { get; set; }
    public string DestinationParty { get; set; }
}

以上是关于如何注释DTO以启用不区分大小写的映射?的主要内容,如果未能解决你的问题,请参考以下文章

映射不区分大小写 - 代码优先 - 实体框架

如何将DTO映射到多个实体?

如何告诉 Hibernate 注释 @Column 区分大小写?

如何将 Grails 域类映射到 DTO?

春天mvc。不区分大小写的获取参数映射

不改变 POJO 的不区分大小写的 JSON 到 POJO 的映射