BreezeJs Ef Core迁移问题

BreezeJs Ef Core migration problems

最近我们将后端 Web api 从 .Net 4.61 升级到 .Net Core 2.0, 我们正在使用 Breezejs,我们对此很满意, 升级后我们遇到了两个无法在线找到答案的问题:

用于升级的全部是:

我们使用此 git 作为指导:https://github.com/mikemichaelis/dnc/

但总结一下:

  1. 使用 .Net 标准库项目和 Scaffold-DbContext(具有所有需要的依赖项)

  2. 使用 Breeze 和 Ef Core 依赖项创建 .Net Core 2.0 WebApi 项目

  3. 将我们的旧控制器迁移到新项目并移除错误

所以首先是问题: 对于只有 return 个实体的列表方法,它工作正常

但是对于 return 是单个 Object 的方法,它给出:

    [HttpGet]
    public Choice ChoiceByID(int ID)
    {
        var result = this.PersistenceManager.Context.Choice
            .SingleOrDefault(n => n.ID == ID);
        return result;
    }

breeze error Error: Unable to convert this endpoint to an IQueryable

如果我们将代码更改为 return IQueryable:

    [HttpGet]
    public IQueryable<Choice> ChoiceByID(int ID)
    {
        var result = this.PersistenceManager.Context.Choice
            .Where(n => n.ID == ID);
        return result;
    }

它会给出:

breeze error Error: This EntityQuery ctor requires a valid json string. The following is not json

到目前为止还没有解决问题

自从迁移到 .net 核心后,请考虑为您的控制器操作遵循建议的语法结构,以避免任何不可预见的问题。

[HttpGet]
public IActionResult ChoiceByID(int ID) {
    var result = this.PersistenceManager.Context.Choice
        .SingleOrDefault(n => n.ID == ID);

    if(result == null)
        return NotFound() 

    Ok(new List<Choice>() { result });
}

或者第二个例子

[HttpGet]
public IActionResult ChoiceByID(int ID) {
    var result = this.PersistenceManager.Context.Choice
        .Where(n => n.ID == ID).ToList();

    if(result.Any())
        return Ok(result);

    return NotFound();
}

经过一些挖掘和克隆 breeze git,我发现了问题所在 似乎 breeze efcore 改变了你应该如何称呼你的终点:

之前没有第一个参数(或者我没有使用它)

所以为了解决问题:

  1. 按照@Nkosi 提供的方式更改您的控制器

  2. 在您的客户端中,添加以下行(在您的构造函数中):

    从 'breeze-client' 导入 * 作为 breeze; //在顶部导入

    breeze.config.initializeAdapterInstance('uriBuilder', 'json') // 添加到你的构造函数