问题描述
我总是尽可能地分离我的代码。我对 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
})
表,其中包含 SharingRequests
、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();
}
我看不出如何通过此限制在逻辑上分离我的代码。这迫使我有一个方法做太多事情。
为什么不能有一种方法来获取用户,另一种方法来构建共享请求(另一种方法进行验证)等?
我是不是错过了什么?完全在这里?我无法想象这是由于重复密钥问题而必须构建应用程序的方式。
解决方法
是的,您遗漏了很多,首先将 db 上下文注入控制器构造函数并在 startup.cs 中注册,其次有一个获取用户并返回它的方法。它与实体框架无关,只知道代码如何工作并发布您实际的方法签名。
您如何拥有多个上下文?它们看起来完全一样。您听说过工作单元模式吗?
该错误与数据库上下文无关,您正在尝试创建一个已经存在的用户。
不要使用 first 总是使用 first 或 default。你应该看看 codewithmosh 他有一个关于实体框架的课程。不要将干净的代码与功能性代码混淆。您必须学习 ef 的基础知识才能对其应用干净的代码规则。按照路径让它工作,然后清理它。