我有这个实体:
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”的属性。我该如何解决?
答案 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
的调用来显式注册每个属性,这在添加新属性时似乎非常容易出错。我认为它应该能够为其编写自定义约定,但是到目前为止我还没有尝试过。