asp.net-core-webapi - 带有 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。
解决方案
实体类型 EpicReportsChildList 具有使用数据注释定义的复合主键。要设置复合主键,请使用 fluent API。
正如错误消息所说,也许您正在使用数据注释或流式 API 方法配置复合主键。
从EF Core Keys 文档中我们可以发现:复合键只能使用 Fluent API 进行配置;约定永远不会设置复合键,并且您不能使用数据注释来配置一个。
所以,请检查相关模型并尝试删除数据注释:[Key]
属性或[ForeignKey]
属性。
更多关于使用组合键配置关系的详细信息,您可以查看以下文章(多对多关系连接表配置为使用组合主键,您可以参考它们):
推荐阅读
- scala - 类型稳定参数多态性
- gradient - NetLogo 中的趋化性
- cassandra - Cassandra 如何翻阅墓碑和活细胞?
- sql - PL/SQL Oracle dbms_output 使输出均匀
- python - Matplotlib:散点图和颜色条颜色不匹配
- swift - SwiftUI Textfield 实际上并未对数据进行更新
- css - How to make a triangle shape with Tailwind?
- python - 保存多张图像
- firebase - Crashlytics 找不到 Google 服务生成的资源文件
- oauth-2.0 - 如何在没有服务器端渲染 CORS 问题的情况下使用 Oauth2.0