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,这在添加新属性时似乎很容易出错。我认为它应该能够为它编写一个自定义约定,但到目前为止我还没有尝试过。
| 归档时间: |
|
| 查看次数: |
348 次 |
| 最近记录: |