C# 如何改进有关EntityCollections的代码<;张力>;?

C# 如何改进有关EntityCollections的代码<;张力>;?,c#,linq,entity-framework,entity-framework-4,entitycollection,C#,Linq,Entity Framework,Entity Framework 4,Entitycollection,这就是我不相信的代码。请检查我如何作为参数传递实体集合 public ExamProduced GetExamProduced(XElement xml) { var examProduced = new ExamProduced { ExamProducedID = (int)xml.Attribute("ExamID"), Date = (DateTime)xml.Attribute("Date"), Seed = (int)x

这就是我不相信的代码。请检查我如何作为参数传递实体集合

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=新examProduced
{
ExamProducedID=(int)xml.Attribute(“ExamID”),
Date=(DateTime)xml.Attribute(“日期”),
Seed=(int)xml.Attribute(“Seed”),
//练习=获取练习(xml)
};
GetExercises(xml,examProduced.Exercises);
返回examProduced;
}
public void GetExercises(XElement xml、EntityCollection、EntityCollection)
{
var objs=
从xml.substands中的目标(“目标”)
其中(bool)客观属性(“产生的”)
让id=(int)objective.Attribute(“id”)
设id2=(Objective)entityService.objections.Where(o=>o.ObjectiveID==id).FirstOrDefault()
选择新练习
{
目标=id2,
化妆=。。。
量化=。。。
分数=。。。
};
foreach(objs中的var练习)
{
entityCollection.Add(练习);
}
}
如果没有,我将收到一个错误。就像这个代码

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;
} 
public ExamProduced GetExamProduced(XElement xml)
{ 
var examProduced=新examProduced
{ 
ExamProducedID=(int)xml.Attribute(“ExamID”),
Date=(DateTime)xml.Attribute(“日期”),
Seed=(int)xml.Attribute(“Seed”),
练习=获取练习(xml)
}; 
返回examProduced;
} 
公共EntityCollection获取练习(XElement xml)
{ 
变量objs=
从xml.substands中的目标(“目标”)
其中(bool)客观属性(“产生的”)
让id=(int)objective.Attribute(“id”)
选择新练习
{ 
ExerciseID=id,
补偿=(bool)objective.Attribute(“补偿”),
Quantify=(字节)(int)objective.Attribute(“Quantify”),
分数=(浮动)objective.Elements().Last().Attribute(“结果”)
}; 
var entityCollection=new entityCollection();
foreach(objs中的var练习)
entityCollection.Add(练习);
返回实体集合;
} 

我得到的错误如下:


未处理InvalidOperationException

无法将对象添加到EntityCollection或 实体引用。附加到ObjectContext的对象不能 被添加到不可用的EntityCollection或EntityReference 与源对象关联


我希望从评论中我能正确地理解你。。。如果没有,我会更新这个答案

首先,您的
EntityCollection GetExercises(XElement xml)
不起作用。正如错误消息所说,您不能像这样构造一个随机的
EntityCollection
:由于它会自动将其列表与上下文同步,因此
EntityCollection
需要将对象附加到上下文。而且,由于您没有说明要将其附加到何处,因此它将不起作用。唯一可行的方法是首先避免创建
EntityCollection

您的
void GetExercises(XElement xml,EntityCollection EntityCollection)
过程可以工作。但是,您需要确保实际拥有一个
EntityCollection
实例才能调用它。按照创建
ExamProduced
对象的方式,当您从
GetExamProduced
返回时,该对象未附加到上下文,因此此时不可能为其设置
EntityCollection
属性

也许最简单的方法是将上下文传递给
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


这就是你想要的,还是我误解了?

我希望从评论中我能正确地理解你。。。如果没有,我会更新这个答案

首先,您的
EntityCollection GetExercises(XElement xml)
不起作用。正如错误消息所说,您不能像这样构造一个随机的
EntityCollection
:由于它会自动将其列表与上下文同步,因此
EntityCollection
需要将对象附加到上下文。而且,由于您没有说明要将其附加到何处,因此它将不起作用。唯一可行的方法是首先避免创建
EntityCollection

您的
void GetExercises(XElement xml,EntityCollection EntityCollection)
过程可以工作。但是,您需要确保实际拥有一个
EntityCollection
实例才能调用它。按照创建
ExamProduced
对象的方式,当您从
GetExamProduced
返回时,该对象未附加到上下文,因此此时不可能为其设置
EntityCollection
属性

也许最简单的方法是将上下文传递给
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

这就是你想要的吗