Как улучшить этот код о EntityCollections<TEntity>?
Это код, в котором я не уверен. Пожалуйста, проверьте, как я передаю в качестве параметра сущность 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, который не связан с исходным объектом.
1 ответ
Надеюсь, что из комментариев я вас правильно понимаю... Если нет, я обновлю этот ответ.
Во-первых, ваш 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
в двух местах.
Это то, что вы ищете, или я неправильно понял?