我是实体框架的新手,我刚开始在空闲时间玩它.我遇到的一个主要问题是如何处理ObjectContexts.
这些通常是首选/推荐的:
这个
public class DataAccess{
MyDbContext m_Context;
public DataAccess(){
m_Context = new MyDbContext();
}
public IEnumerable<SomeItem> GetSomeItems(){
return m_Context.SomeItems;
}
public void DeleteSomeItem(SomeItem item){
m_Context.DeleteObject(item);
m_Context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud)
或这个?
public class DataAccess{
public DataAccess(){ }
public IEnumerable<SomeItem> GetSomeItems(){
MyDbContext context = new DbContext();
return context.SomeItems;
}
public void DeleteSomeItem(SomeItem item){
MyDbContext context = new DbContext();
context.DeleteObject(item);
context.SaveChanges();
}
}
Run Code Online (Sandbox Code Playgroud) 我只是学习实体框架,并在将其与我的分层代码结构相结合方面取得了一些进展.我有2个可视图层,一个业务层和一个数据访问层.
我的问题是在层之间传递实体对象.此代码示例不起作用:
// BLL
public static void Test1()
{
List<User> users = (from u in GetActiveUsers()
where u.ID == 1
select u).ToList<User>();
// Do something with users
}
// DAL
public static IQueryable<User> GetActiveUsers()
{
using (var context = new CSEntities())
{
return from u in context.Users
where u.Employee.FirstName == "Tom"
select u;
}
}
Run Code Online (Sandbox Code Playgroud)
我收到错误消息ObjectContext实例已被释放,不能再用于需要连接的操作.
如果我从GetActiveUsers方法中删除使用它,它工作正常.
我知道这是危险的做法,因为GC可以在任何给定时间处理上下文并搞砸我的BLL.
那么,在层之间传递信息的正确方法是什么?我是否还需要传递上下文?
我使用与实体框架数据库的第一种方法,当我习惯使用的ObjectContext的数据库表被映射的默认模板工作,所以我用来创建#partial类&[MetadataType(typeof运算)以应用数据注解,,但是当我开始使用的DbContext代码生成模板来映射数据库表,我发现,它会在我的示范区创建.TT文件夹都被我发现,我可以直接申请数据注解到的.cs类本身,而不需要创建在objectcontext情况下的部分类.目前数据注释工作正常,但我的方法会导致我不知道的问题,我应该创建部分类,因为我曾经使用Objectcontext吗?BR
我正在寻找Entity Framework 5.0的ObjectContext生成器,而不是DbContext生成器.WCF数据服务需要ObjectContext,不能使用DbContext.如果我想将EF5与DataService一起使用,我必须提供一个ObjectContext.Visual Studio 2010中的ObjectContext生成器和联机用于"ADO"和"EF 4.x"."EF 5.x"的生成器所有产品DbContext对象.
我正在使用Entity Framework和通用存储库模式.我使用以下方法添加对象.
public int Add<TEntity>(TEntity entity) where TEntity : class
{
DataContext.AddObject(GetEntityName<TEntity>(), entity);
return SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
我也在考虑扩展它以支持多个实体.
public int Add<TEntity>(TEntity[] collection) where TEntity : class
{
foreach (TEntity item in collection)
{
DataContext.AddObject(GetEntityName<TEntity>(), item);
}
return SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
在上述场景中使用Parallel.ForEach而不是foreach循环会有实际好处吗?
另外因为我没有SaveChanges()在循环结束之前调用,如果有让我们说主键违规,它会被抛入循环内部还是SaveChanges()被调用时?我可以回滚更改吗?
每个请求使用一个ObjectContext被认为是一种好习惯吗?我读过这些对象应该是短暂的并且实例化的成本并不高,但这是否会使每个请求对其中一个具有吸引力呢?如果是,是否有任何模式正确实现这一点?
c# asp.net web-applications objectcontext entity-framework-4.1
我想创建一个工厂类来返回DbContext表名将作为字符串传递的对象.数据库中有100多个表,每个表都有不同的结构/模式.
我们的想法是通过tableName如string在将在EF返回对象,我们可以选择/更新这些记录的方法.我在一些文章中发现了这段代码,但是如何使用它却有些困惑:
public ObjectContext Context(EntityObject entity)
{
var relationshipManager = ((IEntityWithRelationships)entity).RelationshipManager;
var wrappedOwnerProperty = relationshipManager.GetType().GetProperty("WrappedOwner", BindingFlags.Instance | BindingFlags.NonPublic);
var wrappedOwner = wrappedOwnerProperty.GetValue(relationshipManager);
var contextProperty = wrappedOwner.GetType().GetProperty("Context");
return (ObjectContext)contextProperty.GetValue(wrappedOwner);
}
Run Code Online (Sandbox Code Playgroud)
我不确定这是否是我需要的.还有什么我应该通过在EntityObject entity和我应该在哪里打发tableName?
如果有任何其他方法可以实现相同的目的,请告诉我.
我有一个查询,例如:
Query Syntax 1 - Does not fire the somehandler;
var results = (from I in db.mytable
select new myObject() {
column1 = i.Prop1
}).ToList();
Query Syntax 2 - Does fires the somehandler event;
var results = (from I in db.mytable
select I).toList();
Run Code Online (Sandbox Code Playgroud)
在我的ContextClass中,我有这样的事情:
((IOjectContextAdapter)this).ObjectContext.ObjectMaterialized += somehandler;
Run Code Online (Sandbox Code Playgroud)
我看到的唯一区别是第一个查询从选择结果中构建一个新对象.
知道为什么活动不会开火吗?
我想知道是否有人可以帮助我?
我在理解为什么需要在我的POCO(非代理)实体上发出DetectChanges时遇到问题.
当然我有这一行来确保不返回代理.
context.ObjectStateManager.GetObjectStateEntry(order).State
Run Code Online (Sandbox Code Playgroud)
如果我需要检查一个对象的"状态"然后我需要发出一个checkchChanges但是为什么我需要检查一个对象的状态?
基本上我将我的POCO实体发送到一个方法,该方法将数据保存到新的ObjectContext(我在每个方法上创建并销毁ObjectContext)
因此,我在理解为什么需要使用ObjectContext跟踪或了解更改时遇到问题?
是因为如果不知道是否会被保存?
也许我很想知道,但似乎如果我使用现有的ObjectContext(我不是每次创建和销毁),确保ObjectContext知道将是有益的,否则不会?
因此,在1方法中,我通过创建新的datacontext来更新对象,将其保存到db并销毁ObjectContext.因此我不使用2种方法,1种方法发送更新或新记录,然后使用另一种方法进行保存.
我真的很感激为什么需要它的快速解释?
提前致谢
使用EntityFramework,我在App_Code\DAL中创建了一个EntityDataModel(.edmx文件).在向导中,我将实体命名为"DLGDBEntities".我EntityDataSource在.aspx中有一些s,我将OnContextCreating属性设置为'UseSurveyContext',如下所示:
protected void UseSurveyContext(object sender, EntityDataSourceContextCreatingEventArgs e)
{
e.Context = surveyContext;
}
Run Code Online (Sandbox Code Playgroud)
surveyContext的设置代码如下:
DLGDBEntities surveyContext;
Run Code Online (Sandbox Code Playgroud)
并在Page_Load中:
surveyContext = new DLGDBEntities();
Run Code Online (Sandbox Code Playgroud)
以上所有内容看起来与我在每个教程中看到的代码相同(例如:http://msdn.microsoft.com/en-us/library/cc668193.aspx#1),我可以发誓我已经拥有了它工作.
然而,现在,我收到错误: Cannot implicitly convert type 'DAL.DLGDBEntities' to 'System.Data.Objects.ObjectContext'
我做错了什么,为什么之前有效呢?
我正在使用延迟加载将我的EF6 MVC项目从ObjectContext迁移到DbContext.
使用ObjectContext,我可以执行以下操作:
// Create a new user:
User u = new User();
u.LineManagerID = 42; // Set foreign key
db.Users.Add(u);
db.SaveChanges();
// get property of related entity as set above by foreign key
User lm = u.LineManager;
Run Code Online (Sandbox Code Playgroud)
使用DbContext,u.LineManager即使新实体被正确保存也是null,我怀疑如果我再次调用数据库就可以了.
延迟加载和动态代理都已启用.
为什么新实体不能正确刷新?
请帮忙!我可以看到这种迁移比我想象的要困难得多......!
编辑 - 我应该补充说我正在使用db-first代码生成
如果我使用实体框架进行连接,我怎样才能在sql语言中使用sql查询?我从这篇文章中了解到,ObjectContext.ExecuteStoreQuery无济于事,因为它只适用于某些查询(不是1:1到sql语言).
提到的另一个选项是使用ObjectContext.Connection并从那里编写"经典"ADO.NET代码,但我无法弄清楚如何.
有人可以写一个非常简单的代码示例如何执行简单的查询,如
select MAX(customer_id) from Customers
Run Code Online (Sandbox Code Playgroud)
与实体框架?我知道Linq-To-Sql存在,但我更喜欢使用sql语言,它看起来更简单,我对它更熟悉.
objectcontext ×12
c# ×6
dbcontext ×2
ado.net ×1
asp.net ×1
asp.net-mvc ×1
generator ×1
idisposable ×1
linq ×1
linq-to-sql ×1
poco ×1
sql ×1