Asp.net core ASP.NET核心OData实体,在属性上具有私有setter
我有这个实体:Asp.net core ASP.NET核心OData实体,在属性上具有私有setter,asp.net-core,odata,domain-driven-design,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;
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;
}
在启动方法中,我正在注册EDM模型:
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();
}
);
如果我将私人setter更改为公共setter,则所有设置都有效。还有其他具有私有setter的属性:ODataException产品不包含名为“name”的属性。我怎样才能解决它 这个问题很老了,我现在偶然发现了同样的问题。
ODataConventionModelBuilder
无法识别带有私有setter的标量属性(即int、string、bool),即使它可以识别带有私有setter的集合
我可以使用通过模型生成器获得的EntityTypeConfiguration
解决此问题:
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();
公共类文章
{
公共字符串ArticleNr{get;private set;}
公共字符串SomeProperty{get;private set;}
}
var builder=新的ODataConventionModelBuilder();
var articleBuilder=builder.EntityType();
articleBuilder.HasKey(a=>a.ArticleNr);
articleBuilder.Property(a=>a.SomeProperty);
建造商实体集(“条款”);
var model=builder.GetEdmModel();
这给了我一个可以构建的模型,它可以识别密钥,尽管它是私有setter,我还可以对SomeProperty
发出查询。但是,通过这种方式,必须使用对property
的调用显式注册每个属性,这在添加新属性时似乎非常容易出错。我认为它应该能够为它编写一个自定义约定,但到目前为止我还没有尝试过
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();