如何利用OnModelCreating(Fluent Api EF)中定义的现有密钥在OData v4中使用ODataM

本文关键字:密钥 OData v4 ODataM 定义 OnModelCreating 何利用 Fluent Api EF | 更新日期: 2023-09-27 18:28:43

我必须在Web API项目中实现OData API。

关于在这里(实体关系)和在这里(复合键)做这件事,有一篇非常好的文章。但是所有的源都使用数据注释来设置键。

在我的项目中,所有对实体的约束都是在上下文类中使用Fluent Api定义的。

public class DataContext : DbContext
{
    public DataContext()
    {
    }
    public virtual DbSet<Person> Person { get; set; }
    public virtual DbSet<Car> Car { get; set; }
     ...
     ...
    protected override void OnModelCreating(DbModelBuilder mb)
    {
        ...
         mb.Entity<Person>().HasKey(jq => new { p.Key1, p.Key2 });
        ...
    }
}

要使用OData,我必须在WebApi.config中使用注册各个实体。

ODataModelBuilder builder = new ODataConventionModelBuilder();
            builder.EntitySet<Person>("Person"); 

如何在WebApi.config中为其注册约束?

有没有不声明键(使用数据注释)的解决方案?


实体设计已经被许多WebApi控制器所使用。因此,我希望重用现有模型,而不必仅为一个OData控制器重新定义约束。

如何利用OnModelCreating(Fluent Api EF)中定义的现有密钥在OData v4中使用ODataM

我不确定如何或是否可以重用上下文类中的键,但可以使用从EntitySet方法返回的对象在WebApi.config中创建的实体集上设置它们,如下所示:

var personEntitySet = pobjBuilder.EntitySet<Person>("Person");
personEntitySet.EntityType.HasKey<int>(x => x.Key1);
personEntitySet.EntityType.HasKey<int>(x => x.Key2);