實體框架 - 使用分離實體問題

c# entity-framework

好的,所以在這個例子中我有一個名為Template的父實體。模板始終具有類型。類型是很可能已經存在的FK。創建新模板並向其添加類型時會出現問題。添加類型後,如果要添加模板,則會收到錯誤。您收到的錯誤取決於方法。有誰知道如何處理這種情況?

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

我試過嘗試附加現有密鑰而不是。底部對RemoveTracking的調用只是在模板和可能已加載的任何子實體上調用detach的擴展。

這是單元測試。

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

單元測試完美地假設模板類型“Round”尚不存在。我開始懷疑這種東西在獨立的環境中是否可行。

UPDATE

好的,我將AddTemplate的代碼更改為此,現在它可以正常工作..

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

因此,對於由客戶端添加到新父級的所有現有子實體,當它們準備好被持久化時,必須對它們進行這種工作。有更清潔的方法嗎?也許更通用的東西?

一般承認的答案

將代碼更改為此允許對象狀態管理器跟踪更改並允許添加模板。

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

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因