我一直在调试这个程序没有任何结果,不幸的是我无法看到问题的根源.我得到了这个异常:ObjectContext实例已被释放,不能再用于需要连接的操作.
有2个表: - CustomerSet - OrderSet
Orders表中名为Customer_id的字段可确保表之间的关系,并且Orders表中还有一个名为Customer的虚拟导航属性.
方案如下:我在Orders表中插入一个元素:
Order order = new Order();
Order.order_id = GenerateId(IdType.Order);
Order.date = DateTime.Now;
Order.Customer_id = GetCustomerId(tbCustomerName.Text);
Insert(order);
在Insert方法中,在using语句中有DBContext,因此它在需要时自动处理.我在这里工作.
之后,我需要来自先前插入元素的数据(例如,我需要Customer字段的一些属性).现在我希望Customer领域有价值:
Order o = GetOrder(order.order_id);
我在Customer字段中得到了一个例外:o.Customer抛出了'System.ObjectDisposedException'类型的异常
我正在玩懒惰的装载,打开或关闭它,但我没有锻炼.情况是一样的......
我该弄什么?
真正的好处在于,如果我一步一步地使用F11,它通常可以正常工作!
请帮忙!先感谢您.
如果我有以下存储库:
public IQueryable<User> Users()
{
   var db = new SqlDataContext();
   return db.Users;
}
我知道只有在触发查询时才会打开连接:
public class ServiceLayer
{
   public IRepository repo;
   public ServiceLayer(IRepository injectedRepo)
   {
       this.repo = injectedRepo;
   }
   public List<User> GetUsers()
   {
       return repo.Users().ToList(); // connection opened, query fired, connection closed. (or is it??)
   }
}
如果是这种情况,我还需要使我的Repository实现IDisposable吗?
Visual Studio Code Metrics当然认为我应该.
我正在使用IQueryable因为我将查询控制到我的服务层(过滤器,分页等),所以请不要就我使用它的事实进行架构讨论.
BTW - SqlDataContext是我的自定义类,它扩展了Entity Framework的ObjectContext类(所以我可以拥有POCO派对).
所以问题 - 我真的必须实现IDisposable吗?
如果是这样,我不知道这是如何可能的,因为每个方法共享相同的存储库实例.
编辑
我正在使用Depedency Injection(StructureMap)将具体的存储库注入服务层.这个模式跟随app堆栈 - 我正在使用ASP.NET MVC,并且具体服务被注入到控制器中.
换一种说法:
我正在使用混合模式将依赖项注入我的控制器,根据StructureMap文档,这些实例将存储在HttpContext.Current.Items中.
所以,我不能这样做:
   using (var repo = new …structuremap idisposable iqueryable repository objectcontext
我有这个应用程序,它实际上是两个应用程序,一个 web 应用程序和一个控制台应用程序。控制台应用程序用作 Windows 机器上的计划任务,每天执行 3 次以执行一些重复性工作。这两个应用程序使用相同的模型和存储库,它们放置在单独的项目(类库)中。问题是,如果控制台应用程序需要对数据库进行一些更改,它会更新模型实体并将更改保存到数据库,但是当发生这种情况时,webb 应用程序中的上下文不知道这一点,因此对象上下文不会刷新新的/更新的数据和应用程序的用户无法看到更改。
我的问题是:有没有办法告诉 objectcontext 总是从数据库加载数据,无论是在孔 objectcontext 上还是针对特定查询?
/问候文布拉德
我正在为我的EntityFramework对象创建扩展,如如何:自定义生成的数据对象中所述,但在某些扩展中,我需要获取实例的ObjectContext来查找模型中的其他一些值.我已经找到了提示24 - 如何从实体获取ObjectContext,但这是几年前编写的,这在类似的SO问题中被引用,但我真的希望现在有更好的答案.
当然,这必须是经常需要的东西,以便使用官方方法支持从实体本身检索实体的对象上下文.
提前感谢您提供有关此实施的最新信息.
我对C#和MVC很新,我一直在创建自己的小博客网站作为测试项目.虽然大多数事情都在发挥作用,但我在从LINQ查询中选择多个列时遇到了问题.只有在关于SO的问题上磕磕绊绊之后我才意识到我可以使用生成的实体类作为强类型模型来处理这个问题.我需要这个,因为我一直在创建一个数据库层(这也是我之前没有用过的东西)并试图通过该层传递匿名类型不起作用.我理解为什么会这样,所以我很满意我正朝着正确的方向前进.
然而,这种方法似乎给了我另一个问题.我尝试过一个简单的测试,从我的Categories表中检索2列:CategoryID和Name.我最初尝试了以下内容:
using (MyEntities db = new MyEntities())
{
    var model = from c in db.Categories
                select new Category { CategoryID = c.CategoryID, Name = c.Name };
    return View(model);
}
这给了我在尝试迭代视图中的模型时ObjectContext被置错的错误.在阅读完这个问题后,我尝试将return语句移到using块之外,并在模型上调用AsEnumerable(),如下所示:
IEnumerable<Category> model;
using (MyEntities db = new MyEntities())
{
    model = from c in db.Categories
            select new Category { CategoryID = c.CategoryID, Name = c.Name };
}
return View(model.AsEnumerable());
但是,当我尝试在视图中迭代模型时,这仍然给我相同的ObjectContext处置错误.所以现在我不明白我为什么会收到这个错误.我甚至尝试完全删除using指令,但这给了我一个不同的错误:
"无法在LINQ to Entities查询中构造实体或复杂类型'MyProjectModel.Category'."
如果有帮助,这是我的观点的相关代码:
@model IEnumerable<MyProject.Models.Category>
@foreach (var category in Model)
{
    <p>@category.Name</p>
}
有人会善意地告诉我我错过了什么吗?
谢谢.
我在一个SQL服务器中有很多数据库.我将connectionString作为模板(看看Initial Catalog={0})放入web.config中.  
<add name="ent" connectionString="metadata=res://*/ent.csdl|res://*/ent.ssdl|res://*/ent.msl;provider=System.Data.SqlClient;provider connection string="Data Source=1.1.1.1;Initial Catalog={0};Persist Security Info=True;User ID=user;Password=pass;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
我想用正确的connectionString创建objectContext.我想要做以下事情,CreatObjectContext<SiteEntities>('MySite')但我得到错误Unable to determine the provider name for connection of type 'System.Data.EntityClient.EntityConnection'.
public T CreatObjectContext<T>(string dbName) where T : ObjectContext, new()
{          
       var conStr = ConfigurationManager.ConnectionStrings["ent"].ConnectionString;
       var entityBuilder = new EntityConnectionStringBuilder(conStr);
       entityBuilder.Provider = "System.Data.SqlClient";
       // Build correct conString to the db
       entityBuilder.ProviderConnectionString = string.Format(entityBuilder.ProviderConnectionString, dbName);
       var connection = new EntityConnection(entityBuilder.ConnectionString);                          
       var builder = new ContextBuilder<T>();
       return builder.Create(connection);           
}
我做错了什么?我如何创建上下文?
几天前,我阅读了关于GenericRepository和Unit Of Work模式的教程http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-unit-of -work-patterns-in-an-asp-net-mvc-application.我使用Web表单,我安装了EntityFramework CTP4包.(我不能使用EF 5).
我想为我的项目编写通用存储库代码,但我被困在这一行:
this.dbSet = context.Set<TEntity>();
我知道这行不起作用,因为在我的项目和数据库中首先使用ObjectContext.我怎么处理它?我可以编写通用存储库而无需先迁移到代码(在我的情况下这不是一个选项)吗?
我在WPF应用程序中使用Prism框架和EF.
视图模型:
服务:
库:
这就是我被困住的地方:在处理了对象上下文之后,我不能再使用映射的属性了.我的数据库模型很复杂(许多相关表),并且在检索数据时会有许多.Include()调用使代码变脏.
在阅读了几个主题后,我发现"工作单元"模式可能就是我所需要的.
这是我的问题:
谁继续参考工作单元(以及上下文)?如果我选择每个视图的上下文方法,viewModel应该有上下文引用.我怎样才能将工作单元注入我的服务呢?或者我应该在ViewModel中创建新的Service实例并在构造函数参数中传递上下文?
我有一个使用Visual Studio 2013和ADO.NET实体数据模型(EF6)创建的新项目.
现在我必须使用一些动态数据功能(比如访问MetaTable对象),所以我添加了这段代码:
MetaModel model = new MetaModel();
        model.RegisterContext(() =>
        {
            return ((System.Data.Entity.Infrastructure.IObjectContextAdapter)new KiwiJuiceEntities()).ObjectContext;
        }, new ContextConfiguration() { ScaffoldAllTables = true });
但我有这个错误:
Type of context 'System.Data.Entity.Core.Objects.ObjectContext' is not supported
请注意,该项目的参考已更新为EF6(system.data.entity.core)
objectcontext ×10
c# ×5
asp.net ×1
c#-4.0 ×1
dbcontext ×1
dispose ×1
entity ×1
entityobject ×1
frameworks ×1
idisposable ×1
iqueryable ×1
mvvm ×1
repository ×1
structuremap ×1
unit-of-work ×1