使用 DbContext 时无法分隔代码

Cannot separate code when using DbContext

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

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

所以我有一个SharingRequeststable,里面有UserBorrowerIdUserLenderIdInventoryItemId等信息

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

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();
}

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

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

然而,这意味着,我需要的每个实体,需要加载的等等都需要在一个 await using (var context = new DbContext())

我看不出如何使用此限制从逻辑上分离我的代码。这迫使我有一种方法可以做太多事情。

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

我是不是漏掉了某事。完全在这里?由于重复键问题,我无法想象这是必须构建应用程序的方式。

是的,你错过了很多,首先将数据库上下文注入控制器构造函数并在 startup.cs 中注册,其次有一个获取用户和 returns 的方法。它与 entity framework 无关,只是了解代码的工作原理和 post 您实际的方法签名。

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

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

不使用 first 始终使用 firstordefault。你应该看看 codewithmosh 他有一门关于 entity framework 的课程。不要将干净代码与功能代码混淆。您必须学习 ef 的基础知识才能对其应用干净的代码规则。按照路径让它工作,然后清理它。