首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实体框架ObjectDisposedException

实体框架ObjectDisposedException
EN

Stack Overflow用户
提问于 2012-04-26 21:41:35
回答 1查看 1.5K关注 0票数 0

日安!我使用的是EF 5 Beta 2 CodeFirst。对于我的实体,首先我创建了ConsoleApplication和仓库,但当我创建动态链接库并使用这个仓库时,当我尝试使用仓库时,我有ObjectDisposedException。

示例(var user = (new Repository().GetElementById<ReposirotyEF.User>(resultTesting.Users.Id) as ReposirotyEF.User);格式):

代码语言:javascript
复制
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
                   };
    }

或者:

代码语言:javascript
复制
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 (不好):

代码语言:javascript
复制
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);
        }
    }

感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-26 21:55:31

礼貌地说--这段代码太可怕了。

只有几个主要问题:

  1. 代码从不保存修改过的数据- user = newUser;不会使您的数据持久化。您必须使用context.Entry(user).CurrentValues.SetValues(newUser)而不是
  2. 。您了解泛型的用途吗?为什么要按类型使用switch语句?DbContext允许您通过以下方式以通用方式处理集合:context.Set<T>()
  3. This context.Users.ToList()会将数据库表的整个内容加载到您的应用程序中,您可以在该应用程序中搜索单个记录。这是你能遇到的最好的性能问题之一。使用context.Set<T>().SingleOrDefault(x => x.Id == id)

要理解您的异常,您必须首先找到它发生的位置和释放的对象。例如,您是否在实体上使用导航属性?你希望它们被加载吗?在这种情况下,您必须在处理上下文之前执行此操作。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10334694

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档