Para começarmos a trabalhar com Entity Framework Core temos que criar um projeto com suporte a .NET Core.
Para isso através do Visual Studio vamos criar nosso projeto acessando: File -> New -> Project -> .NET Standard -> Class Library.
Com o projeto criado vamos adicionar o seguinte pacote Tnf.App.EntityFrameworkCore disponível em https://www.myget.org/F/tnf/api/v3/index.json
Podemos agora começar a criar nosso contexto e entidades de nosso banco de dados.
Para isso vamos criar o módulo que fará a configuração do uso do Entity Framework Core.
using Tnf.Reflection.Extensions; using Tnf.App.EntityFrameworkCore; using Tnf.Architecture.Domain; using Tnf.Modules; [DependsOn( typeof(DomainModule), typeof(TnfAppEntityFrameworkCoreModule))] public class EntityFrameworkModule : TnfModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(typeof(EntityFrameworkModule).GetAssembly()); } }
Podemos perceber em nosso módulo definido acima no atributo "DependsOn" fazendo referencia ao TnfAppEntityFrameworkCoreModule. Essa dependência comporta toda a estrutura necessária para a utilização do Entity Framework Core.
Agora podemos definir nossa entidade que representará a tabela:
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using Tnf.Architecture.Dto; using Tnf.AutoMapper; using Tnf.Domain.Entities; [AutoMap(typeof(CountryDto))] [Table("Countries")] public class Country : Entity { public const int MaxNameLength = 256; [Required] [MaxLength(MaxNameLength)] public string Name { get; set; } public Country() { } public Country(int id, string name) { Id = id; Name = name; } }
A definição de nossa tabela pode ser feita usando atributos como no exemplo acima ou utilizando a FluentAPI do proprio Entity Framework Core para definir colunas e tipos de dados.
Note que temos uma herança para a classe Entity do TNF. Por padrão essa herança define que a entidade tenha uma propriedade Id (int) como chave primária.
Para alterar o tipo da chave primaria a ser usada informe através do parâmetro genérico qual tipo será usado. Exemplo: public class Country : Entity<Guid>
O atributo presente no exemplo AutoMapAttribute é um wrapper do TNF para uso do framework AutoMapper que fará o mapeamento automático da nossa tabela para o seu Dto.
Para trabalhar usando contextos do Entity Framework Core devemos definir a classe que fará o acesso e configuração de nossas entidades.
Para isso o próximo passo é definir o DbContext fazendo a herança do TnfDbContext:
using Microsoft.EntityFrameworkCore; using Tnf.Architecture.EntityFrameworkCore.Entities; using Tnf.EntityFrameworkCore; public class SampleDbContext : TnfDbContext { public DbSet<Country> Countries { get; set; } public ArchitectureDbContext(DbContextOptions<SampleDbContext> options) : base(options) { } }
Com nosso contexto criado podemos agora utilizar o Entity Framework Core utilizando o contexto criado.
Para trabalhar com repositórios no TNF você precisa definir um TnfDbContext necessariamente. Quando o repositório for criado ele utilizará o TnfDbContext definido para criá-lo.
Vamos criar um repositório para a entidade criada anteriormente em nosso exemplo:
public interface ICountryRepository : IRepository<Country> { }
Como instalamos o pacote Tnf.App.EntityFrameworkCore e configuramos a dependência do módulo TnfAppEntityFrameworkCoreModule, ao utilizar o tipo ICountryRepository para a entidade "Country", nosso mecanismo de injeção de dependência está injetando o repositório padrão TnfRepositoryBase com suporte a métodos para realizar operações de CRUD e queries mais complexas.
Caso você precise de uma especialização para seu repositório com métodos que você queira definir, você pode utilizar a classe abstrata TnfRepositoryBase<TEntity, TPrimaryKey> e fazer a criação de seu repositório informando a entidade e qual é o tipo de sua chave primaria:
public class CustomCountryRepository : TnfRepositoryBase<Country, int>, ICountryRepository { public override void Delete(Country entity) { throw new NotImplementedException(); } public override void Delete(int id) { throw new NotImplementedException(); } public override IQueryable<Country> GetAll() { throw new NotImplementedException(); } public override Country Insert(Country entity) { throw new NotImplementedException(); } public override Country Update(Country entity) { throw new NotImplementedException(); } }