首页 > 解决方案 > 带有 OData 控制器的 ASP.NET Core Web API 需要使用 fluent API 来实现复合键

问题描述

我有一个现有的 API,它现在在它使用的数据库中有表,这些表必须有一个复合键。我使用 fluent API 来定义 dbcontext 中的键。

protected override void OnModelCreating(ModelBuilder modelBuilder)
     {
        //relationship modeling
        modelBuilder.Entity<Reports>().HasMany(r => r.Screenshots).WithOne().HasForeignKey(r => new { r.ReportId, r.itemTypeId });
        modelBuilder.Entity<Images>().HasOne(s => s.Reports).WithMany(s => s.Screenshots).HasForeignKey(s => new { s.ReportId, s.itemTypeId });
        modelBuilder.Entity<EpicReportsChildList>().HasOne(e => e.Reports).WithMany(e => e.EpicReports).HasForeignKey(e => new { e.TemplateId, e.parentTypeId });
        modelBuilder.Entity<Images>().HasOne(s => s.EpicReports).WithMany(s => s.Screenshots).HasForeignKey(s => new { s.ReportId, s.itemTypeId });

        
    }

我有以下启动文件:

private IEdmModel GetEdmModel()
    {
        var oDatabuilder = new ODataConventionModelBuilder();
        oDatabuilder.EntitySet<Reports>("reports");

        return oDatabuilder.GetEdmModel();
    }

API 返回以下错误:

实体类型EpicReportsChildList具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent API。

标签: asp.net-core-webapiasp.net-core-3.1

解决方案


实体类型 EpicReportsChildList 具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent API。

正如错误消息所说,也许您正在使用数据注释或流式 API 方法配置复合主键。

EF Core Keys 文档中我们可以发现:复合键只能使用 Fluent API 进行配置;约定永远不会设置复合键,并且您不能使用数据注释来配置一个。

所以,请检查相关模型并尝试删除数据注释:[Key]属性或[ForeignKey]属性。

更多关于使用组合键配置关系的详细信息,您可以查看以下文章(多对多关系连接表配置为使用组合主键,您可以参考它们):

EF 一对多组合主键的一部分

在 Entity Framework Core 中配置多对多关系

在 Entity Framework Core 中配置多对多关系


推荐阅读