asp.net-core - 为什么调用 Breeze metadata() 会返回 .net core 3.0.100 的错误
问题描述
到目前为止,我一直在 .net 框架上使用 Breeze。效果很好。对于一个新项目,我想切换到 .net core 3.0.100 来编写后端软件,也就是 web api。
所以这是我第一次使用微风和 EF 设置 .net 核心 Web api 应用程序。根据https://github.com/Breeze/northwind-core-ng-demo 进行设置
- .netcore 3.0.100
- 微风.netcore
- 微风持久 EFCore
- 实体框架 SQLServer
在 persistencemanager 上调用 Metadata() 会引发错误:
Message [string]:"Method not found: 'System.Type Microsoft.EntityFrameworkCore.Metadata.IProperty.get_ClrType()'."
详细错误:
Exception has occurred: CLR/System.MissingMethodException
An exception of type 'System.MissingMethodException' occurred in Breeze.Persistence.EFCore.dll but was not handled in user code: 'Method not found: 'System.Type Microsoft.EntityFrameworkCore.Metadata.IProperty.get_ClrType()'.'
at Breeze.Persistence.EFCore.MetadataBuilder.CreateDataProperty(IProperty p)
at Breeze.Persistence.EFCore.MetadataBuilder.<>c__DisplayClass3_0.<CreateMetaType>b__0(IProperty p)
at System.Linq.Enumerable.SelectEnumerableIterator`2.ToList()
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Breeze.Persistence.EFCore.MetadataBuilder.CreateMetaType(IEntityType et, Dictionary`2 dbSetMap)
at Breeze.Persistence.EFCore.MetadataBuilder.<>c__DisplayClass1_0.<GetMetadataFromContext>b__1(IEntityType et)
at System.Linq.Enumerable.WhereSelectEnumerableIterator`2.ToList()
at System.Linq.Enumerable.ToList[TSource](IEnumerable`1 source)
at Breeze.Persistence.EFCore.MetadataBuilder.GetMetadataFromContext(DbContext dbContext)
at Breeze.Persistence.EFCore.MetadataBuilder.BuildFrom(DbContext dbContext)
at Breeze.Persistence.EFCore.EFPersistenceManager`1.BuildJsonMetadata()
at Breeze.Persistence.PersistenceManager.Metadata()
at JobtrackerBOBreezeController.metaData() in /Users/roydecaestecker/Documents/angular-cli-apps/sulo-solution/Sulo.Jobtracker.BO.Api/Controllers/JobtrackerBOBreezeController.cs:line 21
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Infrastructure.ActionMethodExecutor.SyncObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync()
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(State& next, Scope& scope, Object& state, Boolean& isCompleted)
at Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeNextActionFilterAsync()
克兰特模型
[Table("klant", Schema="Sulo")]
public class Klant
{
public Klant(){}
[Key]
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int id { get; set; }
public string naam { get; set; }
}
数据库上下文
using Microsoft.EntityFrameworkCore;
namespace Sulo.Jobtracker.Model
{
public class SuloJobtrackerContext : DbContext
{
public SuloJobtrackerContext(DbContextOptions options) : base(options) { }
public DbSet<Klant> klanten { get; set; }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Klant>();
}
}
}
项目文件
<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>netcoreapp3.0</TargetFramework>
<UserSecretsId>...</UserSecretsId>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Sulo.Jobtracker.Model\Sulo.Jobtracker.Model.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Breeze.AspNetCore.NetCore" Version="1.0.3.3" />
<PackageReference Include="Breeze.Persistence.EFCore" Version="1.0.3.3" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="3.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="3.0.0" />
</ItemGroup>
</Project>
微风控制器
using Microsoft.AspNetCore.Mvc;
using Newtonsoft.Json.Linq;
using System.Linq;
using Breeze.Persistence;
using Breeze.AspNetCore;
using Microsoft.AspNetCore.Authorization;
[Breeze.AspNetCore.BreezeQueryFilter]
[Route("api/v1/[controller]/[action]")]
public class JobtrackerBOBreezeController {
private SuloJobtrackerPersistenceManager persistenceManager;
public JobtrackerBOBreezeController(SuloJobtrackerContext dbcontext){
persistenceManager = new SuloJobtrackerPersistenceManager(dbcontext);
}
[HttpGet, HttpOptions]
public string metaData() {
return persistenceManager.Metadata();
}
[HttpGet, HttpOptions]
[Authorize]
public IQueryable<Klant> klanten() {
return persistenceManager.Context.klanten;
}
}
调用 klanten() 方法工作得很好
解决方案
.NET Core 3 的微风支持已发布。
推荐阅读
- javascript - javascript没有在window.open中正确读取PHP变量
- javascript - parent.location 可以信任吗?
- php - php 数组函数看不到数组中的值。称它为空
- pdf - C# 中的 iText:GetPage 从第一个返回所有页面
- microsoft-graph-api - 我可以使用 Microsoft 的 Graph API 发送 OneDrive 文件请求吗?
- android - 使用滑动从数据库中删除项目 - Sqflite
- python - 从第 n 个元素切片到第 n 个元素,但考虑到它离开的最后一个索引
- python - 特定容器硒python中的所有元素属性
- python - 确定对象是向上还是向下
- javascript - jQuery - 仅在 ajax 加载特定 div 后运行脚本