Entity Framework - デタッチエンティティの操作に関する問題

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"のテンプレートタイプがまだ存在しないと仮定して、完全に機能します。私はこの種のものが分離環境で可能であるかどうか疑問に思い始めています。

更新

わかりました私はこれに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は合法ですか? はい、理由を学ぶ