日安!我使用的是EF 5 Beta 2 CodeFirst。对于我的实体,首先我创建了ConsoleApplication和仓库,但当我创建动态链接库并使用这个仓库时,当我尝试使用仓库时,我有ObjectDisposedException。
示例(var user = (new Repository().GetElementById<ReposirotyEF.User>(resultTesting.Users.Id) as ReposirotyEF.User);格式):
public static ResultModel PopulateResultModel(ResultTesting resultTesting)
{
string name = string.Empty;
var user = (new Repository().GetElementById<ReposirotyEF.User>(resultTesting.Users.Id) as ReposirotyEF.User);
name = user.Name;
return new ResultModel()
{
Id = resultTesting.Id,
Name = name,
Result = resultTesting.Result,
Answers = resultTesting.Answers,
Data = resultTesting.TimeEnd,
RightAnswers = resultTesting.RightAnswers,
Time = resultTesting.Time
};
}或者:
public void SaveOrUpdate<T>(T obj)
{
using (var context = new ContextTest1())
{
switch (typeof(T).Name)
{
case "User":
User user = context.Users.ToList().Find(u => u.Id == (obj as User).Id);
User newUser = obj as User;
if (user != null)
{
user = newUser;
}
else
{
context.Users.Add(newUser);
}
break;
case "ResultTesting":
var resultTesting = context.ResultTestings.ToList().Find(u => u.Id == (obj as ResultTesting).Id);
var newRes = obj as ResultTesting;
if (resultTesting != null)
{
resultTesting = newRes;
}
else
{
context.ResultTestings.Add(newRes);
}
break;
case "Question":
var question = context.Questions.ToList().Find(u => u.Id == (obj as Question).Id);
var newQue = obj as Question;
if (question != null)
{
question = newQue;
}
else
{
context.Questions.Add(newQue);
}
break;
default:
//context.CurrentTestings.ToList().Remove(obj as CurrentTesting);
var currentTesting = context.CurrentTestings.ToList().Find(u => u.Id == (obj as CurrentTesting).Id);
var newCur = obj as CurrentTesting;
if (currentTesting != null)
{
currentTesting = newCur;
}
else
{
context.CurrentTestings.Add(newCur);
}
break;
}
context.SaveChanges();
}
}在context.CurrentTestings.Add(newCur);中
和我的GetElementById (不好):
public IId GetElementById<T>(int id)
where T : IId
{
using (var context = new ContextTest1())
{
switch (typeof(T).Name)
{
case "User":
return context.Users.ToList().Find(u => u.Id == id);
case "ResultTesting":
return context.ResultTestings.ToList().Find(u => u.Id == id);
case "Question":
return context.Questions.ToList().Find(u => u.Id == id);
}
return context.CurrentTestings.ToList().Find(u => u.Id == id);
}
}感谢您的帮助。
发布于 2012-04-26 21:55:31
礼貌地说--这段代码太可怕了。
只有几个主要问题:
user = newUser;不会使您的数据持久化。您必须使用context.Entry(user).CurrentValues.SetValues(newUser)而不是context.Set<T>()context.Users.ToList()会将数据库表的整个内容加载到您的应用程序中,您可以在该应用程序中搜索单个记录。这是你能遇到的最好的性能问题之一。使用context.Set<T>().SingleOrDefault(x => x.Id == id) 要理解您的异常,您必须首先找到它发生的位置和释放的对象。例如,您是否在实体上使用导航属性?你希望它们被加载吗?在这种情况下,您必须在处理上下文之前执行此操作。
https://stackoverflow.com/questions/10334694
复制相似问题