ASP.NET Core OData实体,具有属性的专用设置器

时间:2018-08-13 09:10:25

标签: asp.net-core odata domain-driven-design

我有这个实体:

    public int Id { get; private set; }
    public string Name { get; private set; }
    public Behavior Behavior { get; private set; }

    public Product(int id, string name, Behavior behavior)
    {
        Id = id;
        Name = name;
        Behavior = behavior;
    }

在启动方法中,我正在注册EdmModel:

        var builder = new ODataConventionModelBuilder();
        var entitySet = builder.EntitySet<Product>("Products");
        entitySet.EntityType.HasKey(x => x.Id);


        var model = builder.GetEdmModel();



        app.UseMvc(route =>
        {
            route.Select().Filter().Expand().OrderBy().Count().MaxTop(null);
            route.MapODataServiceRoute("odata", null, model);
            route.EnableDependencyInjection();
        }
        );

运行我的应用程序时,会发生此异常:

         InvalidOperationException: The entity 'Product' does not have a key 
         defined.

如果我将私有设置员更改为公开设置,则一切正常。具有私有设置器的其他属性也有提供:ODataException产品不包含名称为“ Name”的属性。我该如何解决?

1 个答案:

答案 0 :(得分:2)

这个问题已经很老了,我现在偶然发现了同一个问题。 ODataConventionModelBuilder无法识别带有私有设置器的标量属性(即int,string,bool),即使它可以识别带有私有设置器的集合。

我可以使用通过模型构建器获得的EntityTypeConfiguration<T>解决问题:

public class Article
{
    public string ArticleNr { get; private set; }
    public string SomeProperty { get; private set; }
}


var builder = new ODataConventionModelBuilder();

var articleBuilder = builder.EntityType<Article>();
articleBuilder.HasKey(a => a.ArticleNr);
articleBuilder.Property(a => a.SomeProperty);

builder.EntitySet<Article>("Articles");

var model = builder.GetEdmModel();

这为我提供了一个可以构建的模型,尽管它具有私有设置器,但它仍然可以识别密钥,而且我还可以针对SomeProperty发出查询。但是通过这种方式,必须使用对Property的调用来显式注册每个属性,这在添加新属性时似乎非常容易出错。我认为它应该能够为其编写自定义约定,但是到目前为止我还没有尝试过。