ASP.NET Core OData 实体在属性上具有私有设置器

Nic*_*liu 6 domain-driven-design odata asp.net-core

我有这个实体:

    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;
    }
Run Code Online (Sandbox Code Playgroud)

在启动方法中,我正在注册 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();
        }
        );
Run Code Online (Sandbox Code Playgroud)

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

         InvalidOperationException: The entity 'Product' does not have a key 
         defined.
Run Code Online (Sandbox Code Playgroud)

如果我将私人二传手更改为公共所有工作。其他带有私有 setter 的属性也给出了:ODataException 产品不包含名为“Name”的属性。我该如何解决?

小智 4

这个问题很老了,我现在偶然发现了同样的问题。带有私有 setter 的标量属性(即 int、string、bool)不能被 识别ODataConventionModelBuilder,即使它识别带有私有 setter 的集合。

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();
Run Code Online (Sandbox Code Playgroud)

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