Entity Framework - Trabajar con problema de entidades separadas

c# entity-framework

Pregunta

Ok, entonces en este ejemplo tengo una entidad matriz llamada Plantilla. Una plantilla siempre tiene un tipo. El tipo es un FK que es muy probable que ya exista. El problema viene al crear una nueva plantilla y agregarle el tipo. Una vez que se agrega el tipo y va a agregar la plantilla, recibirá un error. El error que recibas depende del enfoque. ¿Alguien sabe cómo trabajar con este tipo de situación?

public static void AddTemplate(Template template)
    {
        using (TheEntities context = new TheEntities())
        {
            //if (template.TemplateType.EntityKey != null)
            //{
            //    context.Attach(template.TemplateType);
            //}

            context.AddToTemplates(template);
            context.SaveChanges();

            context.RemoveTracking(template);
        }
    }

He intentado ambos intentar adjuntar la clave existente y no. La llamada en la parte inferior de RemoveTracking es simplemente una extensión para llamar a la separación en la plantilla y cualquier entidad secundaria que se haya cargado.

Aquí está la prueba de la unidad.

[TestMethod]
    public void CanAddAndDeleteATemplate()
    {
        Template template = new Template();
        template.Name = "Test";
        template.Description = "Test";

        TemplateType type = TemplateManager.FindTemplateTypeByName("Round");

        if (type == null)
        {
            type = new TemplateType();
            type.Name = "Round";
        }

        template.TemplateType = type;

        TemplateManager.AddTemplate(template);

        template = TemplateManager.FindTemplateByID(template.TemplateID);

        Assert.IsNotNull(template);

        TemplateManager.DeleteTemplate(template);

        template = TemplateManager.FindTemplateByID(template.TemplateID);

        Assert.IsNull(template);
    }

La prueba de la unidad funciona perfectamente suponiendo que un tipo de plantilla de "Ronda" no existe todavía. Estoy empezando a preguntarme si este tipo de cosas es posible en un entorno aislado.

ACTUALIZAR

Ok, cambié mi código para AddTemplate a esto y ahora funciona ...

public static void AddTemplate(Template template)
    {
        using (TheEntities context = new TheEntities())
        {
            if (template.TemplateType.EntityKey != null)
            {
                TemplateType type = template.TemplateType;
                template.TemplateType = null;
                context.AttachTo("TemplateTypes", type);
                template.TemplateType = type;
            }


            context.AddToTemplates(template);
            context.SaveChanges();

            context.RemoveTracking(template);
        }
    }

Por lo tanto, para todas las entidades secundarias existentes que un cliente agregue a un nuevo padre tendrá que realizar este tipo de trabajo cuando estén listas para persistir. ¿Hay una manera más limpia de hacer esto? ¿Tal vez algo un poco más genérico?

Respuesta aceptada

Cambiar el código a este permite al administrador de estado de objetos realizar un seguimiento del cambio y permitir que se agregue la Plantilla.

public static void AddTemplate(Template template)
    {
        using (TheEntities context = new TheEntities())
        {
            if (template.TemplateType.EntityKey != null)
            {
                TemplateType type = template.TemplateType;
                template.TemplateType = null;
                context.AttachTo("TemplateTypes", type);
                template.TemplateType = type;
            }


            context.AddToTemplates(template);
            context.SaveChanges();

            context.RemoveTracking(template);
        }
    }


Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow