OData中实体的别名/重命名属性

使用ODataConventionModelBuilder及其EntitySetfunction,是否可以重命名实体集上的属性名称?

假设我有一个实体集类型, Foo 。 它有两个属性, BarBaz 。 但是,在我的OData模型中,我希望这些属性分别命名为JackJane 。 我可以这样做吗?

我希望这样的事情:

 var builder = new ODataConventionModelBuilder { Namespace = "Blah" }; var foo = builder.EntitySet("Foo"); foo.AliasProperty(f => f.Bar, "Jack"); foo.AliasProperty(f => f.Baz, "Jane"); 

到目前为止,我一直无法找到这样做的东西。

是的你可以。 基于https://github.com/OData/ODataSamples/blob/master/WebApi/v4/ODataModelAliasingSample/ODataModelAliasingSample/Program.cs :

 var builder = new ODataConventionModelBuilder { Namespace = "Blah" }; var foo = builder.EntitySet("Foo"); foo.Property(f => f.Bar).Name = "Jack"; foo.Property(f => f.Baz).Name = "Jane"; 

我一直无法将其用于导航属性。

您可以使用DataContract / DataMember以明确的方式执行此操作,例如

 [DataContract] public class Foo { [DataMember] public Id { get; set;} [DataMember(Name = "Jack"] public string Bar { get; set;} [DataMember(Name = "Jane"] public string Baz { get; set;} public int Fizz { get; set; } [NotMapped] public bool Buzz { get; set; } 

任何没有属性或[NotMapped]的东西都不会出现在OData模型中。

好处

  • 可用于任何属性类型,包括导航
  • 保留元数据中类的属性顺序,更改
    ODataConventionModelBuilder在模型构建之前发生,因此
    你倾向于先看到你的房产

缺点

  • 使用NotMapped属性可能会干扰您的数据库映射,有时可以使用没有属性意味着它不会在OData模型中的约定

这也在官方文档http://odata.github.io/WebApi/#02-04-convention-model-builder中以及[ConcurrencyCheck]和[ComplexType]等其他属性中进行了描述。