使用 DbContext 时无法分隔代码
Cannot separate code when using DbContext
我总是尽量分离我的代码。我是 ASP.NET Core 的新手,但代码原则和软件设计模式在所有语言中都是相同的,但是,在使用实体框架时,有些事情困扰我,或者我不知道如何处理.
在我的应用程序中,我有用户,这些用户当然是在注册时创建的。用户可以将特定项目添加到他们的库存中,并请求其他用户共享项目。
所以我有一个SharingRequests
table,里面有UserBorrowerId
、UserLenderId
、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();
}
我收到错误消息,该用户已存在于数据库中,并且由于重复键而无法创建新条目。
在谷歌搜索这个问题后,我发现这是因为我有多个数据库上下文,而第二个上下文不知道第一个。
然而,这意味着,我需要的每个实体,需要加载的等等都需要在一个 await using (var context = new DbContext())
我看不出如何使用此限制从逻辑上分离我的代码。这迫使我有一种方法可以做太多事情。
为什么不能有一种方法获取用户,另一种方法构建共享请求(另一种方法进行验证)等?
我是不是漏掉了某事。完全在这里?由于重复键问题,我无法想象这是必须构建应用程序的方式。
是的,你错过了很多,首先将数据库上下文注入控制器构造函数并在 startup.cs 中注册,其次有一个获取用户和 returns 的方法。它与 entity framework 无关,只是了解代码的工作原理和 post 您实际的方法签名。
你如何拥有多个上下文?他们看起来完全一样。你听说过工作单元模式吗?
该错误与数据库上下文无关,您正在尝试创建一个已经存在的用户。
不使用 first 始终使用 firstordefault。你应该看看 codewithmosh 他有一门关于 entity framework 的课程。不要将干净代码与功能代码混淆。您必须学习 ef 的基础知识才能对其应用干净的代码规则。按照路径让它工作,然后清理它。
我总是尽量分离我的代码。我是 ASP.NET Core 的新手,但代码原则和软件设计模式在所有语言中都是相同的,但是,在使用实体框架时,有些事情困扰我,或者我不知道如何处理.
在我的应用程序中,我有用户,这些用户当然是在注册时创建的。用户可以将特定项目添加到他们的库存中,并请求其他用户共享项目。
所以我有一个SharingRequests
table,里面有UserBorrowerId
、UserLenderId
、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();
}
我收到错误消息,该用户已存在于数据库中,并且由于重复键而无法创建新条目。
在谷歌搜索这个问题后,我发现这是因为我有多个数据库上下文,而第二个上下文不知道第一个。
然而,这意味着,我需要的每个实体,需要加载的等等都需要在一个 await using (var context = new DbContext())
我看不出如何使用此限制从逻辑上分离我的代码。这迫使我有一种方法可以做太多事情。
为什么不能有一种方法获取用户,另一种方法构建共享请求(另一种方法进行验证)等?
我是不是漏掉了某事。完全在这里?由于重复键问题,我无法想象这是必须构建应用程序的方式。
是的,你错过了很多,首先将数据库上下文注入控制器构造函数并在 startup.cs 中注册,其次有一个获取用户和 returns 的方法。它与 entity framework 无关,只是了解代码的工作原理和 post 您实际的方法签名。
你如何拥有多个上下文?他们看起来完全一样。你听说过工作单元模式吗?
该错误与数据库上下文无关,您正在尝试创建一个已经存在的用户。
不使用 first 始终使用 firstordefault。你应该看看 codewithmosh 他有一门关于 entity framework 的课程。不要将干净代码与功能代码混淆。您必须学习 ef 的基础知识才能对其应用干净的代码规则。按照路径让它工作,然后清理它。