...
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | EntityFrameworkCoreModule.cs |
---|
linenumbers | true |
---|
|
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(Assembly));
}
} |
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.
...
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | Country.cs |
---|
linenumbers | true |
---|
|
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;
}
} |
...
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | ICountryRepository.cs |
---|
linenumbers | true |
---|
|
public interface ICountryRepository : IRepository<Country>
{
} |
Essa interface está dentro do projeto de Domain para que ele não precise conhecer o projeto de Arquitetura.
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 EfCoreRepositoryBasepadrão AppEfCoreRepositoryBase com suporte a métodos para realizar operações de CRUD e queries mais complexas.
...
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | CustomCountryRepository.cs |
---|
linenumbers | true |
---|
|
public class CustomCountryRepository : EfCoreRepositoryBase<ArchitectureDbContextAppEfCoreRepositoryBase<ArchitectureDbContext, Country, int>, ICountryRepository
{
public ProfessionalRepository(IDbContextProvider<ArchitectureDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
public override Professional Get(decimal id)
{
return base.Get(id);
}
} |
...
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | ProfessionalPoco.cs |
---|
linenumbers | true |
---|
|
using System;
using System.Collections.Generic;
using Tnf.Architecture.Dto.Registration;
using Tnf.AutoMapper;
using Tnf.Domain.Entities;
namespace Tnf.Architecture.EntityFrameworkCore.Entities
{
[AutoMap(typeof(ProfessionalDto))]
public class ProfessionalPoco : Entity
{
public ProfessionalPoco()
{
}
public decimal ProfessionalId { get; set; }
public string Name { get; set; }
public Guid Code { get; set; }
public string Address { get; set; }
public string AddressNumber { get; set; }
public string AddressComplement { get; set; }
public string ZipCode { get; set; }
public string Phone { get; set; }
public string Email { get; set; }
public List<ProfessionalSpecialtiesPoco> ProfessionalSpecialties { get; set; }
}
} |
...
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | IProfessionalRepository.cs |
---|
linenumbers | true |
---|
|
using System;
using System.Collections.Generic;
using Tnf.ArchitectureApp.Dto.Request;
using Tnf.Architecture.Common.ValueObjects;
using Tnf.Architecture.DtoDomain.Registration;
using Tnf.Domain.Repositories;
namespace Tnf.Architecture.Domain.Interfaces.Repositories
{
public interface IProfessionalRepository : IRepository
{
PagingResponseDto<ProfessionalDto>Professional GetAllProfessionals(GetAllProfessionalsDto requestGetProfessional(IRequestDto<ComposeKey<Guid, decimal>> requestDto);
ProfessionalDto GetProfessional(ProfessionalKeysDto keys);
ProfessionalDto CreateProfessional(ProfessionalDtoComposeKey<Guid, decimal> CreateProfessional(Professional entity);
ProfessionalDtovoid UpdateProfessional(ProfessionalDtoProfessional dtoentity);
bool DeleteProfessional(ProfessionalKeysDtoComposeKey<Guid, decimal> keys);
void AddOrRemoveSpecialties(ProfessionalKeysDtoComposeKey<Guid, decimal> keys, List<SpecialtyDto>IList<Specialty> dtospecialties);
bool ExistsProfessional(ProfessionalKeysDtoComposeKey<Guid, decimal> keys);
}
}
|
Bloco de código |
---|
language | c# |
---|
firstline | 1 |
---|
title | ProfessionalRepository.cs |
---|
linenumbers | true |
---|
|
using Tnf.Architecture.Domain.Interfaces.RepositoriesMicrosoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using TnfSystem.EntityFrameworkCore.RepositoriesLinq;
using TnfSystem.EntityFrameworkCoreTransactions;
using Tnf.ArchitectureApp.EntityFrameworkCore.EntitiesAutoMapper;
using Tnf.ArchitectureApp.Dto.Request;
using SystemTnf.CollectionsApp.GenericEntityFrameworkCore;
using System.LinqTnf.App.EntityFrameworkCore.Repositories;
using Tnf.Architecture.Common.AutoMapperValueObjects;
using Tnf.Architecture.DtoDomain.Interfaces.RegistrationRepositories;
using Microsoft.EntityFrameworkCoreTnf.Architecture.Domain.Registration;
using System;
namespace Tnf.Architecture.Dto.Registration;
using Tnf.Architecture.EntityFrameworkCore.Contexts;
using Tnf.Architecture.EntityFrameworkCore.Entities;
using Tnf.Domain.Uow;
using Tnf.EntityFrameworkCore;
namespace Tnf.Architecture.EntityFrameworkCore.Repositories
{
public class ProfessionalRepository : EfCoreRepositoryBase<LegacyDbContextAppEfCoreRepositoryBase<LegacyDbContext, ProfessionalPoco>, IProfessionalRepository
{
private readonly IUnitOfWorkManager _unitOfWorkManager;
public ProfessionalRepository(IDbContextProvider<LegacyDbContext> dbContextProvider, IUnitOfWorkManager unitOfWorkManager)
: base(dbContextProvider)
{
}
_unitOfWorkManager = unitOfWorkManager;
}
public bool DeleteProfessional(ProfessionalKeysDtoComposeKey<Guid, decimal> keys)
{
var dbEntity = Context.Professionals
.Include(i => i.ProfessionalSpecialties)
.SingleOrDefault(s => s.ProfessionalId == keys.ProfessionalIdSecundaryKey && s.Code == keys.CodePrimaryKey);
if (dbEntity !== null)
{
return false;
dbEntity.ProfessionalSpecialties.ForEach(w => Context.ProfessionalSpecialties.Remove(w));
Context.Professionals.Remove(dbEntity);
}
return dbEntity != nulltrue;
}
private ProfessionalPoco GetProfessionalPoco(ProfessionalKeysDto keysIRequestDto<ComposeKey<Guid, decimal>> requestDto)
{
var dbEntity = Context.Professionals
.Include(i => i.ProfessionalSpecialtiesIncludeByRequestDto(requestDto)
.Where(w => w.ProfessionalId == requestDto.ThenInclude(iGetId().SecundaryKey && w.Code => i.Specialty= requestDto.GetId().PrimaryKey)
.SingleOrDefault(w => w.ProfessionalId == keys.ProfessionalId && w.Code == keys.CodeSelectFieldsByRequestDto(requestDto)
.SingleOrDefault();
return dbEntity;
}
public ProfessionalDtoProfessional GetProfessional(ProfessionalKeysDto keysIRequestDto<ComposeKey<Guid, decimal>> requestDto)
{
var dbEntity = GetProfessionalPoco(keysrequestDto);
returnif (dbEntity !== null ? dbEntity.MapTo<ProfessionalDto>() : null;
}
public ProfessionalDto CreateProfessional(ProfessionalDto entity)
{return null;
var dbEntitydto = entitydbEntity.MapTo<ProfessionalPoco>MapTo<Professional>();
Context.Professionals.Add(dbEntity)return dto;
}
Context.SaveChanges(); public ComposeKey<Guid, decimal> CreateProfessional(Professional entity)
{
returnvar dbEntity = entity.MapTo<ProfessionalDto>MapTo<ProfessionalPoco>();
}dbEntity.ProfessionalId = GetNextKeyProfessional();
public ProfessionalDto UpdateProfessional(ProfessionalDto entity)Context.Professionals.Add(dbEntity);
{
Context.SaveChanges();
var mappedEntity = GetProfessionalPoco( return new ProfessionalKeysDto(entity.ProfessionalIdComposeKey<Guid, decimal>(dbEntity.Code, entitydbEntity.CodeProfessionalId));
}
entity.MapTo(mappedEntity); private decimal GetNextKeyProfessional()
{
Context.Professionals.Update(mappedEntity);
using (var uow = Context_unitOfWorkManager.SaveChangesBegin(TransactionScopeOption.RequiresNew);)
return mappedEntity.MapTo<ProfessionalDto>();{
}
publicvar PagingResponseDto<ProfessionalDto> GetAllProfessionals(GetAllProfessionalsDto request)lastKey = Context.Professionals.Select(s => s.ProfessionalId).DefaultIfEmpty(0).Max();
{
return (lastKey var response = new PagingResponseDto<ProfessionalDto>(+ 1);
var}
dbBaseQuery = Context.Professionals
}
public void .IncludeUpdateProfessional(i => i.ProfessionalSpecialtiesProfessional entity)
{
.Include("ProfessionalSpecialties.Specialty")
var mappedEntity = GetProfessionalPoco(new RequestDto<ComposeKey<Guid, decimal>>(new .Where(w => request.Name == null || w.Name.Contains(request.Name));
var dbQuery = dbBaseQuery
.Skip(request.Offset)ComposeKey<Guid, decimal>(entity.Code, entity.ProfessionalId)));
.Take(request.PageSize)
entity.MapTo(mappedEntity);
.ToArray(Context.Professionals.Update(mappedEntity);
response.Total = base.CountContext.SaveChanges();
}
response.Data = dbQuery.MapTo<List<ProfessionalDto>>();
public void AddOrRemoveSpecialties(ComposeKey<Guid, decimal> keys, IList<Specialty> specialties)
return response;
{
}
var publicrequest void= AddOrRemoveSpecialties(ProfessionalKeysDtonew keysRequestDto<ComposeKey<Guid, List<SpecialtyDto> dto)
{decimal>>(keys) { Expand = new ProfessionalDto().Expandables[0] };
var dbProfessional = GetProfessionalPoco(keysrequest);
if (dbProfessional !== null)
{
return;
var idsToAdd = dtospecialties.Select(s => s.Id).ToArray();
if (dbProfessional.ProfessionalSpecialties == null)
dbProfessional.ProfessionalSpecialties = new List<ProfessionalSpecialtiesPoco>();
dbProfessional.ProfessionalSpecialties.RemoveAll(w => !idsToAdd.Contains(w.SpecialtyId));
foreach (var specialty dto.ForEach(w =>in specialties)
{
var dbProfessionalSpecialties = dbProfessional.ProfessionalSpecialties
.FirstOrDefault(s => s.SpecialtyId == wspecialty.Id);
if (dbProfessionalSpecialties == null)
{
dbProfessional.ProfessionalSpecialties.Add(new ProfessionalSpecialtiesPoco()
{
ProfessionalId = dbProfessional.ProfessionalId,
Code = dbProfessional.Code,
SpecialtyId = wspecialty.Id
});
}
});
}
}
public bool ExistsProfessional(ProfessionalKeysDtoComposeKey<Guid, decimal> keys)
{
var dbEntity = Context.Professionals
.SingleOrDefault(s => s.ProfessionalId == keys.ProfessionalIdSecundaryKey && s.Code == keys.CodePrimaryKey);
return dbEntity != null;
}
}
}
|
Este exemplo com umas estrutura legada esta disponível em nosso github: https://github.com/totvsnetcore/tnf-samples/tree/master/TnfSample-Architecture
...