Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EF Core-Return使用Automapper从OData映射多对多关系 信息_C#_Entity Framework Core_Odata_Automapper - Fatal编程技术网

C# EF Core-Return使用Automapper从OData映射多对多关系 信息

C# EF Core-Return使用Automapper从OData映射多对多关系 信息,c#,entity-framework-core,odata,automapper,C#,Entity Framework Core,Odata,Automapper,应用程序类型是托管Blazor web程序集。下面是我正在使用的nuget软件包的版本。尝试展开多对多关系的导航属性时出错。这些类被映射到DTO类,使中间关系类变得平坦 .Net核心版本=“3.1” AutoMapper Version=“10.0.0” AutoMapper.AspNetCore.OData.EFCore Version=“2.0.1” AutoMapper.Extensions.ExpressionMapping Version=“4.0.1” AutoMapper.Ext

应用程序类型是托管Blazor web程序集。下面是我正在使用的nuget软件包的版本。尝试展开多对多关系的导航属性时出错。这些类被映射到DTO类,使中间关系类变得平坦

  • .Net核心版本=“3.1”
  • AutoMapper Version=“10.0.0”
  • AutoMapper.AspNetCore.OData.EFCore Version=“2.0.1”
  • AutoMapper.Extensions.ExpressionMapping Version=“4.0.1”
  • AutoMapper.Extensions.Microsoft.DependencyInjection Version=“8.0.1”
  • Microsoft.AspNetCore.Components.WebAssembly.Server Version=“3.2.1”
  • Microsoft.AspNetCore.OData Version=“7.5.0”
要运行此repo,您需要SQL Server的免费版本或更高版本

将efcoreadmapperodata.Server项目设置为启动项目,并导航到课程页面(https://localhost:5001/courses)然后单击任一课程。这将引发以下错误:

System.InvalidOperationException:类型“Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions”上没有泛型方法“Include”与提供的类型参数和参数兼容。如果方法是非泛型的,则不应提供类型参数。在System.Linq.Expressions.Expression.FindMethod(类型类型、字符串方法名、类型[]typeArgs、表达式[]args、BindingFlags标志).

模型 有关类定义,请参见和

自动映射配置
public类AutomapperConfig:Profile
{
公共自动映射配置()
{
CreateMap();
CreateMap();
CreateMap()
.FormMember(dto=>dto.Students,opt=>{
opt.MapFrom(=>u.Student.Select(y=>y.Student));
});
CreateMap()
.ForMember(ent=>ent.Students,ex=>ex
.MapFrom(x=>x.Students.Select(y=>newcoursestudent{
CourseId=x.Id,
StudentId=y.Id
})));
CreateMap()
.FormMember(dto=>dto.Courses,opt=>{
opt.MapFrom(x=>x.Courses.Select(y=>y.Courses));
})
.ForMember(dto=>dto.Friends,opt=>{
opt.MapFrom(x=>x.Friends.Select(y=>y.Friends));
});
CreateMap()
.ForMember(ent=>ent.Courses,ex=>ex
.MapFrom(x=>x.Courses.Select(y=>newcoursestudent
{
StudentId=x.Id,
CourseId=y.Id
})));
}
}
启动
公共类启动
{
公共启动(IConfiguration配置)
{
配置=配置;
}
公共IConfiguration配置{get;}
public void配置服务(IServiceCollection服务)
{
//----为了简洁起见,删除了一些代码------
services.AddOData();
services.AddAutoMapper(cfg=>{cfg.AddExpressionMapping();},typeof(AutomapperConfig));
//----为了简洁起见,删除了一些代码------
}
public void配置(IApplicationBuilder应用程序、IWebHostEnvironment环境)
{
//----为了简洁起见,删除了一些代码------
app.UseHttpsRedirection();
app.UseBlazorFrameworkFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(端点=>
{
endpoints.MapRazorPages();
endpoints.MapControllers();
endpoints.EnableDependencyInjection();
endpoints.Select().Filter().OrderBy().Count().Expand().MaxTop(1000);
MapODataRoute(“odata”,“odata”,GetEdmModel());
MapFallbackToFile(“index.html”);
});
}
私有IEdmModel GetEdmModel()
{
var builder=新的ODataConventionModelBuilder();
建筑商实体集(“课程”);
建筑商实体集(“讲师”);
建筑商、实体集(“学生”);
返回builder.GetEdmModel();
}
}
航向控制员
公共类课程控制器:ODataController
{
受保护的只读BlazorContext\u上下文;
受保护的只读映像映射器;
公共课程控制器(BlazorContext上下文,IMapper映射器)
{
_上下文=上下文;
_映射器=映射器;
}
[HttpGet]
[ODataRoute(“课程”)]
公共异步任务获取(ODataQueryOptions选项)
{
返回Ok(wait_context.Course.GetAsync(_mapper,options));
}
[HttpGet]
[ODataRoute(“Courses({id})”)]
公共异步任务Get([FromODataUri]int-id,ODataQueryOptions选项)
{
返回Ok((wait_context.Course.GetAsync(_mapper,options))。其中(s=>s.Id==Id.ToList());
}
}
失败的ODataAPI查询示例
/odata/课程?$expand=学生

复制 我已经为本期制作了演示Blazor WASM应用程序

常规设置 要使扩展工作,您需要允许使用
$expand
。按如下方式显式配置:

private IEdmModel GetedModel()
{
var builder=新的ODataConventionModelBuilder();
builder.EntitySet(名称(MyContext.Estimates))
.EntityType
.Expand();//opt.MapFrom(x=>x.EstimateTypes.Select(y=>y.Type));
//扩展工作需要以下映射:
CreateMap()
福门博先生(
dto=>dto.subtype,
opt=>opt.MapFrom(x=>x.Type));
CreateMap()
.表格
https://localhost:5001/odata/Estimates(1)?$expand=Types
https://localhost:5001/odata/Estimates(1)?$expand=Types($expand=SubTypes)