Entitätsframework - Problem mit getrennten Entitäten

c# entity-framework

Frage

Ok, also habe ich in diesem Beispiel eine übergeordnete Entität namens Template. Eine Vorlage hat immer einen Typ. Der Typ ist ein FK, der höchstwahrscheinlich bereits existiert. Das Problem tritt auf, wenn eine neue Vorlage erstellt und der Typ hinzugefügt wird. Sobald der Typ hinzugefügt wurde und Sie die Vorlage hinzufügen, wird eine Fehlermeldung angezeigt. Welcher Fehler Sie erhalten, hängt von der Vorgehensweise ab. Weiß jemand, wie man mit dieser Situation umgeht?

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

Ich habe sowohl versucht, den vorhandenen Schlüssel anzubringen, als auch nicht. Der Aufruf von RemoveTracking am unteren Rand ist einfach eine Erweiterung, um die Trennung von Schablonen und eventuell untergeordneten Entitäten aufzurufen.

Hier ist der Unit-Test.

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

Der Komponententest funktioniert einwandfrei, wenn ein Vorlagentyp "Runde" noch nicht vorhanden ist. Ich frage mich, ob so etwas in einer freistehenden Umgebung möglich ist.

AKTUALISIEREN

Ok, ich habe meinen Code für AddTemplate geändert und jetzt funktioniert es.

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

Für alle vorhandenen untergeordneten Entitäten, die von einem Client zu einem neuen übergeordneten Element hinzugefügt werden, muss diese Art von Arbeit dann erledigt werden, wenn sie bereit sind, persistiert zu werden. Gibt es einen saubereren Weg, dies zu tun? Vielleicht etwas generischeres?

Akzeptierte Antwort

Wenn Sie den Code so ändern, kann der Objektstatus-Manager die Änderung verfolgen und die Vorlage hinzufügen.

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


Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum
Lizenziert unter: CC-BY-SA with attribution
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum