使用 DbContext 时无法分离代码

问题描述

我总是尽可能地分离我的代码。我对 ASP.NET Core 还很陌生,但是所有语言的代码原则和软件设计模式都相同,但是,在使用实体框架时,有些事情困扰着我,或者我不知道如何处理.

在我的应用程序中,我有用户,这些用户当然是在注册时创建的。用户可以将特定项目添加到他们的库存中,并请求其他用户共享项目。

所以我有一个 type DTO = { a: string | null,b: string } type FilterdDTO = Omit<DTO,'a'> & { a: string }; const test = [] as DTO[]; function isFilterdDTO(dto: DTO): dto is FilterdDTO { return dto.a !== null; } const filtered = test.filter(isFilterdDTO); filtered.forEach(({ a,b }) => { a // var a: string }) 表,其中包含 SharingRequestsUserBorrowerIdUserLenderId 等信息

当我现在想要创建共享请求并将用户分配给它时,我必须在相同的上下文中进行所有操作。例如,如果我这样做

InventoryItemId
MethodA: 
await using (var context = new DbContext())
{
    User user = context
        .Users
        .Where(u => u.Id == userId)
        .First();
}

methodB(user);

我收到错误,该用户已存在于数据库中,并且由于重复键而无法创建新条目。

谷歌搜索这个问题后,我发现这是,因为我有多个数据库上下文,而第二个上下文不知道第一个

然而,这意味着,我需要的每个实体,需要加载等。都需要合一MethodB: await using (var context = new DbContext()) { Item item = context .Items .Where(i => i.Id == itemId) .First(); SharingRequest sharingRequest = new SharingRequest(); sharingRequest.Item = item; sharingRequest.User = user; context.SharingRequests.AddAsync(sharingRequest); context.SaveChangesAsync(); }

我看不出如何通过此限制在逻辑上分离我的代码。这迫使我有一个方法做太多事情。

为什么不能有一种方法获取用户,另一种方法来构建共享请求(另一种方法进行验证)等?

我是不是错过了什么?完全在这里?我无法想象这是由于重复密钥问题而必须构建应用程序的方式。

解决方法

是的,您遗漏了很多,首先将 db 上下文注入控制器构造函数并在 startup.cs 中注册,其次有一个获取用户并返回它的方法。它与实体框架无关,只知道代码如何工作并发布您实际的方法签名。

您如何拥有多个上下文?它们看起来完全一样。您听说过工作单元模式吗?

该错误与数据库上下文无关,您正在尝试创建一个已经存在的用户。

不要使用 first 总是使用 first 或 default。你应该看看 codewithmosh 他有一个关于实体框架的课程。不要将干净的代码与功能性代码混淆。您必须学习 ef 的基础知识才能对其应用干净的代码规则。按照路径让它工作,然后清理它。