首页 > 解决方案 > 为什么调用 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 进行设置

  1. .netcore 3.0.100
  2. 微风.netcore
  3. 微风持久 EFCore
  4. 实体框架 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() 方法工作得很好

标签: asp.net-core.net-coreentity-framework-corebreeze

解决方案


.NET Core 3 的微风支持已发布

并且更新了https://github.com/Breeze/northwind-demo


推荐阅读