Entity Framework - Utilizzo del problema delle entità distaccate

c# entity-framework

Domanda

Ok, quindi in questo esempio ho un'entità genitore chiamata Template. Un modello ha sempre un tipo. Il tipo è un FK che è molto probabile che esista già. Il problema si presenta quando si crea un nuovo modello e si aggiunge ad esso il tipo. Una volta aggiunto il tipo e si va ad aggiungere il modello, si riceve un errore. Quale errore ricevi dipende dall'approccio. Qualcuno sa come lavorare con questo tipo di situazione?

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);
        }
    }

Ho provato entrambi i tentativi di collegare la chiave esistente e non. La chiamata in basso a RemoveTracking è semplicemente un'estensione per chiamare il distacco sul modello e su qualsiasi entità secondaria che potrebbe essere stata caricata.

Ecco il test unitario.

[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);
    }

Il test unitario funziona perfettamente assumendo che un tipo di modello di "Round" non esiste ancora. Sto iniziando a chiedermi se questo tipo di cose sia possibile in un ambiente distaccato.

AGGIORNARE

Ok ho cambiato il mio codice per AddTemplate a questo e ora funziona ..

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);
        }
    }

Pertanto, per tutte le entità figlio esistenti che vengono aggiunte a un nuovo genitore da un cliente, questo deve essere eseguito su di esse quando sono pronte per essere mantenute. C'è un modo più pulito per fare questo? Forse qualcosa di un po 'più generico?

Risposta accettata

La modifica del codice consente al gestore dello stato dell'oggetto di tracciare la modifica e consentire l'aggiunta del modello.

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);
        }
    }


Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché