【问题标题】:ASP.NET Core Web API with OData controller needs to use fluent API for composite key带有 OData 控制器的 ASP.NET Core Web API 需要使用 fluent API 来实现复合键
【发布时间】:2020-12-17 07:34:14
【问题描述】:

我有一个现有的 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-webapi asp.net-core-3.1


    【解决方案1】:

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

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

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

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

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

    EF one to many on part of composite primary key

    Configure Many-to-Many Relationships in Entity Framework Core

    Configuring Many To Many Relationships in Entity Framework Core

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-26
      • 2017-09-28
      • 1970-01-01
      • 2020-08-23
      • 2015-01-08
      • 2015-08-18
      • 2016-09-13
      • 2020-04-18
      相关资源
      最近更新 更多