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
这就是你想要的吗