2

これは私が確信していないコードです。エンティティ Collection をパラメーターとして渡す方法を確認してください。

public ExamProduced GetExamProduced(XElement xml)
{
    var examProduced = new ExamProduced
    {
        ExamProducedID = (int)xml.Attribute("ExamID"),
        Date = (DateTime)xml.Attribute("Date"),
        Seed = (int)xml.Attribute("Seed"),
        //Exercises = GetExercises(xml)
    };

    GetExercises(xml, examProduced.Exercises);
    return examProduced;
}

public void GetExercises(XElement xml, EntityCollection<Exercise> entityCollection)
{
    var objs =
        from objective in xml.Descendants("Objective")
        where (bool)objective.Attribute("Produced")
        let id = (int)objective.Attribute("ID")
        let id2 = (Objective)entityService.Objectives.Where(o => o.ObjectiveID == id).FirstOrDefault()
        select new Exercise
        {
            Objective = id2,
            MakeUp = ...
            Quantify = ...
            Score = ...
        };

    foreach (var exercise in objs)
    {
        entityCollection.Add(exercise);
    }
}

そうでない場合は、エラーが発生します。このコードでこのように。

public ExamProduced GetExamProduced(XElement xml) 
{ 
    var examProduced = new ExamProduced 
    { 
        ExamProducedID = (int)xml.Attribute("ExamID"), 
        Date = (DateTime)xml.Attribute("Date"), 
        Seed = (int)xml.Attribute("Seed"), 
        Exercises = GetExercises(xml) 
    }; 

    return examProduced; 
} 

public EntityCollection<Exercise> GetExercises(XElement xml) 
{ 
    var objs = 
        from objective in xml.Descendants("Objective") 
        where (bool)objective.Attribute("Produced") 
        let id = (int)objective.Attribute("ID") 
        select new Exercise 
        { 
            ExerciseID = id, 
            MakeUp = (bool)objective.Attribute("MakeUp"), 
            Quantify = (byte)(int)objective.Attribute("Quantify"), 
            Score = (float)objective.Elements().Last().Attribute("Result") 
        }; 

        var entityCollection = new EntityCollection<Exercise>();

        foreach (var exercise in objs)
            entityCollection.Add(exercise);

        return entityCollection;
} 

ここに画像の説明を入力

私が得ているエラーは以下の通りです:

InvalidOperationException が処理されませんでした。

オブジェクトを EntityCollection または EntityReference に追加できませんでした。ObjectContext にアタッチされているオブジェクトは、ソース オブジェクトに関連付けられていない EntityCollection または EntityReference に追加できません。

4

1 に答える 1

0

コメントから私があなたを正しく理解していることを願っています...そうでない場合は、この回答を更新します。

まず、あなたEntityCollection<Exercise> GetExercises(XElement xml)はうまくいきません。EntityCollectionエラー メッセージが示すように、そのような乱数を作成することはできませんEntityCollection。 は、そのリストをコンテキストと自動的に同期させるため、オブジェクトをコンテキストにアタッチする必要があります。そして、どこに何を取り付けるかを言っていないので、機能しません。EntityCollectionそれを機能させる唯一の方法は、最初から を作成しないようにすることです。

あなたのvoid GetExercises(XElement xml, EntityCollection<Exercise> entityCollection)手順はうまくいくかもしれません。ただし、実際に呼び出すことができるインスタンスがあること確認する必要があります。EntityCollection<Exercise>オブジェクトを作成する方法ExamProducedでは、 から戻るまでにコンテキストにアタッチされていないため、その時点でプロパティGetExamProducedを持つことはできません。EntityCollection<Exercise>

おそらく、物事を機能させる最も簡単な方法は、コンテキストをGetExamProducedメソッドに渡し、コンテキストに自動的にアタッチさせることです。私はそれが commonObjectContextであると仮定していますが、必要に応じて更新できます:

public ExamProduced GetExamProduced(XElement xml, YourContext context)
{
    var examProduced = new ExamProduced()
    {
        ExamProducedID = (int)xml.Attribute("ExamID"),
        Date = (DateTime)xml.Attribute("Date"),
        Seed = (int)xml.Attribute("Seed")
    };
    context.ExamsProduced.Attach(examProduced);
    LoadExercises(xml, context, examProduced);
    // examProduced.Exercises should be available at this point
    return examProduced;
}

public void LoadExercises(XElement xml, YourContext context, ExamProduced examProduced)
{
    foreach (var exercise in
        from objective in xml.Descendants("Objective")
        where (bool)objective.Attribute("Produced")
        let id = (int)objective.Attribute("ID")
        let id2 = (Objective)entityService.Objectives.Where(o => o.ObjectiveID == id).FirstOrDefault()
        select new Exercise
        {
            ExamProduced = examProduced,
            Objective = id2,
            MakeUp = ...
            Quantify = ...
            Score = ...
        }))
    {
        context.Exercises.Attach(exercise);
    }
}

これらがデータベースに追加する必要がある新しいオブジェクトなのか、またはこれらのオブジェクトがデータベースに既に存在すると予想されるのかはわかりません。私は後者を想定しています。前者の場合、2ヶ所.Attachにアップデートする必要があります。.AddObject

これはあなたが探しているものですか、それとも私が誤解していましたか?

于 2011-12-18T19:20:25.180 に答える