none
Patron de repositorio RRS feed

  • Pregunta

  • Buenas tardes, con este patron, puede implementar en el Create insertar un rango de valores, lo que estoy tratando de hacer es usar el async y await para que no se quede congelada la pantalla al momento del insert. Pero no le encuentro la vuelta. me esta costando realizarlo.

    // CLASE IREPOSITORY
    IEnumerable<TEntity> CreateRange<TEntity>(IEnumerable<TEntity> newEntity) where TEntity : class;
    
            
    // CLASE REPOSITORY 
    public IEnumerable<TEntity> CreateRange<TEntity>(IEnumerable<TEntity> newEntity) where TEntity : class
            {
                IEnumerable<TEntity> Result = null;
                try
                {
                    Result = Context.Set<TEntity>().AddRange(newEntity);
                    TrySaveChanges();
                }
                catch (DbEntityValidationException dbEx)
                {
                    string strError = "";
                    foreach (var validationErrors in dbEx.EntityValidationErrors)
                    {
                        foreach (var validationError in validationErrors.ValidationErrors)
                        {
                            strError += string.Format("Prperty:{0} Error{1}",
                                validationError.PropertyName,
                                validationError.ErrorMessage);
                        }
                    }
                }
                return Result;
            }
    // PRESENTACION Form1private void GuardarLista()
            {
                List<Articulos_Familias> tFamiliaArt = new List<Articulos_Familias>();
                int id = 0;            
                for (int i = 0; i < 100; i++)
                {
                    var tART = new Articulos_Familias()
                    {
                        DscFamilia = txtNombre.Text.Trim() + " - " + id.ToString(),
                        IdFamilia = id++                    
                    };
                    tFamiliaArt.Add(tART);
                }
                repository.CreateRange<Articulos_Familias>(tFamiliaArt);
            }
    Desde ya muchas gracias


    Saludos, Gastón Marengo

    domingo, 19 de julio de 2020 2:54

Respuestas

  • hola

    Tiene sentido definir una funcion TrySaveChanges() para una sola linea ?

    public async Task<IEnumerable<TEntity>> CreateRange<TEntity>(IEnumerable<TEntity> newEntity) where TEntity : class
    {
    	IEnumerable<TEntity> Result = null;
    	try
    	{
    		Result = await Context.Set<TEntity>().AddRangeAsync(newEntity);
    		await Context.SaveChangesAsync();
    	}
    	catch (DbEntityValidationException dbEx)
    	{
    		string strError = "";
    		foreach (var validationErrors in dbEx.EntityValidationErrors)
    		{
    			foreach (var validationError in validationErrors.ValidationErrors)
    			{
    				strError += string.Format("Prperty:{0} Error{1}",
    					validationError.PropertyName,
    					validationError.ErrorMessage);
    			}
    		}
    	}
    	
    	return Result;
    }


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Gaston Marengo lunes, 20 de julio de 2020 22:49
    lunes, 20 de julio de 2020 0:02
  • Hola

    ¿Te han funcionado las respuestas? Si nos puedes actualizar tu estado, sería genial!

    Saludos

    lunes, 20 de julio de 2020 14:23
    Moderador

Todas las respuestas

  • hola

    Que codigo implementas en el TrySaveChanges() ?

    No es para que lo copies tal cual, pero analiza

     Repository Pattern – Generic Async Repositories in C#

    alli veras que ademas de usar Task<> tambien aplican las lineas

    await Context.Set<T>().AddAsync(entity);
    await Context.SaveChangesAsync();

    en el Add()

    tienes que usar la interface asincrona de EF

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    domingo, 19 de julio de 2020 4:13
  • hola buenos dias, si ese mismo, estoy tratando de implementar en TrySaveChanges(), y modificarlo para que lo tome o como task o async, hoy tengo el metodo asi.

    protected virtual int TrySaveChanges()
    {
        return Context.SaveChanges();
    }

    Y queria ver como aca le podia poner el async 

    Saludos y Gracias

     


    Saludos, Gastón Marengo

    domingo, 19 de julio de 2020 15:35
  • hola

    Tiene sentido definir una funcion TrySaveChanges() para una sola linea ?

    public async Task<IEnumerable<TEntity>> CreateRange<TEntity>(IEnumerable<TEntity> newEntity) where TEntity : class
    {
    	IEnumerable<TEntity> Result = null;
    	try
    	{
    		Result = await Context.Set<TEntity>().AddRangeAsync(newEntity);
    		await Context.SaveChangesAsync();
    	}
    	catch (DbEntityValidationException dbEx)
    	{
    		string strError = "";
    		foreach (var validationErrors in dbEx.EntityValidationErrors)
    		{
    			foreach (var validationError in validationErrors.ValidationErrors)
    			{
    				strError += string.Format("Prperty:{0} Error{1}",
    					validationError.PropertyName,
    					validationError.ErrorMessage);
    			}
    		}
    	}
    	
    	return Result;
    }


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta Gaston Marengo lunes, 20 de julio de 2020 22:49
    lunes, 20 de julio de 2020 0:02
  • Hola

    ¿Te han funcionado las respuestas? Si nos puedes actualizar tu estado, sería genial!

    Saludos

    lunes, 20 de julio de 2020 14:23
    Moderador