{"id":25338033,"url":"https://github.com/rickedb/efcore-patterns","last_synced_at":"2025-04-08T10:43:40.813Z","repository":{"id":225922051,"uuid":"766761429","full_name":"Rickedb/efcore-patterns","owner":"Rickedb","description":null,"archived":false,"fork":false,"pushed_at":"2024-03-07T18:18:28.000Z","size":11,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-04-15T07:17:42.776Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Rickedb.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2024-03-04T04:27:58.000Z","updated_at":"2024-04-18T12:21:54.530Z","dependencies_parsed_at":null,"dependency_job_id":"45f2d3f9-4de4-42b1-b66d-eb31f2f76f02","html_url":"https://github.com/Rickedb/efcore-patterns","commit_stats":{"total_commits":3,"total_committers":1,"mean_commits":3.0,"dds":0.0,"last_synced_commit":"b74812a8b80103facc50a89b3852fb0b65148ecd"},"previous_names":["rickedb/efcore-patterns"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rickedb%2Fefcore-patterns","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rickedb%2Fefcore-patterns/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rickedb%2Fefcore-patterns/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Rickedb%2Fefcore-patterns/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Rickedb","download_url":"https://codeload.github.com/Rickedb/efcore-patterns/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247828123,"owners_count":21002969,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-14T06:57:06.234Z","updated_at":"2025-04-08T10:43:40.795Z","avatar_url":"https://github.com/Rickedb.png","language":"C#","funding_links":[],"categories":[],"sub_categories":[],"readme":"﻿# EFCore Patterns\n\nO pattern mais utilizado costuma ser o Repository, no entanto, de acordo com a documentação do EF o proprio `DbContext` já é uma abstração de UoW e Repository pattern:\n\n\u003e Summary:\nA DbContext instance represents a session with the database and can be used to query and save instances of your entities. DbContext is a combination of the Unit Of Work and Repository patterns.\n\nPortanto, o Repository pattern acaba não tendo tanto valor quanto quando usamos `SqlConnection` diretamente, \na não ser o de separar as queries do código e a pergunta que fica é: **qual a melhor alternativa usando EF?**\n\n\nPra isso, esse repositório deve conter alguns estudos experimentais para entender \n**quais casos seriam** melhor determinado pattern.\n\nA ideia de uma classe como \"Repository\" ainda é muito presente em todos as maneiras, já que primeiramente o `DbSet\u003cTEntity\u003e` não pode ser herdado e também\n[não é aconselhado](https://github.com/dotnet/efcore/issues/12422) pelos próprios desenvolvedores do EntityFramework e que não possuem planos pra isso pois\nos ganhos em virtude da complexidade alteração são mínimos.\n\nVamos ver se chegamos à alguma conclusão... ¯\\＿(ツ)＿/¯\n\n## RepositoryPattern\n\nO padrão que todos conhecem que recebe o Context e trabalha as queries em cima desse contexto.\n\nO exemplo em `LazyWeatherForecastRepository` sugere uma abordagem sem a necessidade de usar o repository dentro do DI,\nefetuando um lazy loading \"na mão\" e usando a propriedade que seria um DbSet, para ser o próprio repositório criado.\nNo entanto, ainda assim a API do DbSet se torna acessível por conta do método `Set\u003cTEntity\u003e()` do próprio `DbContext`.\n\n## DbExtensionPattern\n\nBasicamente se firma em métodos de extensão que vão extender o comportamento do DbSet, o que seria análogo à um repository, mas são acessíveis diretamente\npelo DbSet do contexto, facilitando o consumo e dando uma abordagem mais como `context.Forecasts.InRange(startAt, endAt);`.\n\n## DbSetPattern\n\nAtua como um [Proxy](https://refactoring.guru/design-patterns/proxy) ou [Decorator](https://refactoring.guru/design-patterns/decorator) basicamente,\npodendo extender o comportamento e atuar como um Repository, mas usando sempre o DbSet ao invés do Context como seria em um Repository convencional.\n\nA parte ruim é que existe um overhead muito grande e uma classe dedicada a ser um \"one-liner\" para que todas as interfaces e implementações\npossam ser \"redirecionadas\" para o DbSet original.\n\n# Conclusões\n\n\u003e Esta seção pode mudar ao longo do tempo com base nos testes e abordagens novas ou atualizações no EF\n\nNão existe muito uma fuga do que conhecemos como Repository Pattern, sempre será necessário uma classe que receba um Context ou DbSet de uma entidade \ne ela fará a interação com eles. Conseguir jogar como se fosse um DbSet dentro do Context pode ser uma abordagem legal caso você não queira\nficar injetando dezenas de classe diferentes no seu DI.\n\nIsso é possível seja com uma abordagem de repository ou do que foi nomeado com \"DbSetPattern\".","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frickedb%2Fefcore-patterns","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frickedb%2Fefcore-patterns","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frickedb%2Fefcore-patterns/lists"}