Как улучшить этот код о EntityCollections <TEntity>? - PullRequest
2 голосов
/ 17 декабря 2011

Это код, в котором я не уверен. Пожалуйста, проверьте, как я передаю в качестве параметра сущность 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;
} 

enter image description here

Я получаю ошибку ниже:

Исключительная ситуация InvalidOperationException не обработана.

Объект не может быть добавлен в коллекцию EntityCollection или EntityReference. Объект, который присоединен к ObjectContext, не может быть добавленным к EntityCollection или EntityReference, который не является связанный с исходным объектом.

1 Ответ

0 голосов
/ 18 декабря 2011

Я надеюсь, что из комментариев я вас правильно понимаю ... Если нет, я обновлю этот ответ.

Во-первых, ваш EntityCollection<Exercise> GetExercises(XElement xml) не будет работать. Как говорится в сообщении об ошибке, вы не можете создать случайный EntityCollection следующим образом: EntityCollection необходимо, чтобы объект был присоединен к контексту, поскольку он автоматически синхронизирует свой список с контекстом. И так как вы не говорите, что прикрепить его где-либо, это не сработает. Единственный способ заставить его работать - это вообще не создавать EntityCollection.

Ваша void GetExercises(XElement xml, EntityCollection<Exercise> entityCollection) процедура может работать. Однако вы должны убедиться, что на самом деле есть экземпляр EntityCollection<Exercise>, чтобы иметь возможность вызывать его. То, как вы создаете свой ExamProduced объект, к моменту возврата из GetExamProduced он не привязывается к контексту, поэтому в этот момент невозможно иметь для него свойство EntityCollection<Exercise>.

Возможно, самый простой способ заставить вещи работать - это передать ваш контекст методу GetExamProduced и позволить им автоматически присоединиться к контексту. Я предполагаю, что это обычный ObjectContext, но вы можете обновить его при необходимости:

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

Я не знаю, являются ли это новые объекты, которые должны быть добавлены в базу данных, или ожидается, что эти объекты уже существуют в базе данных. Я предположил последнее. Если первое, .Attach должно быть обновлено до .AddObject в двух местах.

Это то, что вы ищете, или я неправильно понял?

...