【问题标题】:Blazor w/ Entity Framework Core - compile errorBlazor w/Entity Framework Core - 编译错误
【发布时间】:2019-11-13 06:36:49
【问题描述】:

我有以下设置,但无法完成构建,因为我在文件 Blazor.MonoRuntime.targets (MSB3073) 中收到与第 439 行相关的模糊错误。

这是否意味着 Entity Framework Core 将无法与 Blazor 预览版 6 一起使用?

详情:

  • Asp.net 托管 Blazor
  • AspNetCore.Blazor (3.0.0-preview6.19307.2)
  • Microsoft.EntityFrameworkCore (3.0.0-preview6.19304.10)
  • Microsoft.EntityFrameworkCore.Design (3.0.0-preview6.19304.10)
  • Microsoft.EntityFrameworkCore.SqlServer (3.0.0-preview6.19304.10)

通过黑客解决方案解决!

不知何故,我能够解决所有问题并使事情顺利进行 端到端。我相信重要的、关键的事情是:
* 确保 Blazor 客户端和服务器项目不直接引用实体框架
* 不要让 Blazor 客户端引用(直接或间接)带有生成实体的项目)。为了访问模型,我 只需创建生成实体的副本(并删除 “部分”来自生成的类)

【问题讨论】:

  • 您是否尝试使用 Blazor 客户端的 EntityFramework?如果是这样,这是不可能的。
  • 我希望 Blazor 服务器项目与数据层项目通信(通过 API)。我通过这个数据项目中的脚手架生成了 EF 数据上下文。所以现在我有数据项目(具有生成的数据库上下文)和服务器项目(具有 EF6 引用,因为脚手架需要它)。
  • 你的“黑客解决方案”真的很糟糕。只需查看 Hosted starter 模板。当然服务器部分可以使用EF。 DTO 模型是个好主意,但不是必需的。
  • @HenkHolterman - 你能提出更好的方法吗?
  • 我已经做到了。托管应用程序的服务器部分可以并且应该引用 EF。代码优先模型是完全独立的,因此它可以位于共享部分,但更好的架构表明它不应该。最好的数据库模型有点难以摆脱 EF,但您所做的还算不错。但请注意,DTO 不必是实体类的精确副本。根据需要展平和省略。

标签: entity-framework-core blazor


【解决方案1】:

这里需要澄清一下,对吧:

  • 您不能在 Blazor 的客户端项目上使用实体框架。 Entity Framework 是一种服务器技术。

  • 您可以在应用程序的服务器项目上使用实体框架。

  • 您的客户端和服务器托管端之间的通信通常通过 Http 调用(HttpClient 服务)完成,但您也可以使用 SignleR。

  • 要启用 Http 调用,您应该公开 Http 路由端点...这可以通过使用带有所需端点的 Web Api 来启用。您的 Web Api 公开方法(控制器的方法)可以通过 Entity Framework 对象直接访问数据库(如果您定义了存储库、服务等,则可以间接访问),并将查询到的数据返回给调用方法(HttpClient 方法)。

请注意,在我的回答中,我特别涉及 Blazor 客户端应用程序,但对于 Blazor 服务器端应用程序而言,这主要是正确的。我可以在这里补充一点,在 Blazor 服务器端应用程序中,您不必使用 Web Api,因为 Blazor 是在服务器上执行的。在这种情况下,您可以定义一个普通服务来从数据库中检索数据,并将其传递给调用方法(此处不涉及 HttpClient)。

  • 共享项目旨在包含前端和后端都可以使用的对象。这是您可以定义模型对象的地方。例如,您可以定义一个 Employee 类,该类可用于检索数据并将其作为 Employee 对象列表传递给 Client,并且在 Client 中您可以定义将存储检索数据的 Employee 对象列表。简而言之,您不必定义两种类型的对象,一种适合服务器,另一种适合客户端(假设您的客户端是 Angular 应用程序)。

希望这有帮助..

【讨论】:

  • 感谢您的回答。这与我对这一切的理解非常吻合。
猜你喜欢
  • 1970-01-01
  • 2020-03-19
  • 2023-03-07
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 2020-07-14
相关资源
最近更新 更多