Árvore de páginas

Você está vendo a versão antiga da página. Ver a versão atual.

Comparar com o atual Ver Histórico da Página

« Anterior Versão 11 Próxima »

Criando o projeto

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.

EntityFrameworkCoreModule.cs
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.

Definindo uma entidade

Agora podemos definir nossa entidade que representará a tabela:

Country.cs
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.

Definindo um contexto

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:

SampleDbContext
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.

Criando um Repositório

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:

ICountryRepository.cs
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 EfCoreRepositoryBase 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 fazer override dos métodos do repositório ou implementar de acordo com a sua necessidade:

CustomCountryRepository.cs
public class CustomCountryRepository : EfCoreRepositoryBase<ArchitectureDbContext, Country, int>, ICountryRepository
{
	public ProfessionalRepository(IDbContextProvider<ArchitectureDbContext> dbContextProvider) 
		: base(dbContextProvider)
	{
	}
	
	public override Professional Get(decimal id)
	{
    	return base.Get(id);
	}
}
  • Sem rótulos