关键词:
【中文标题】我应该如何监听从 ObjectContext 添加/删除的实体?【英文标题】:How should I listen for entities being added/deleted from an ObjectContext? 【发布时间】:2012-01-08 15:22:31 【问题描述】:据我所知,ObjectContext
没有公开任何直接监听添加/删除项目的方法。您可以连接到SavingChanges
事件,并查询ObjectStateManager
中添加或删除了哪些项目。但这有几个问题:
SavingChanges
的用途似乎并非如此——它更多的是用于验证数据而不是通知更改。
这是主观的,但我只是觉得错了。
我已经通过实现一个有限版本的存储库模式来解决这个问题——它处理创建、读取和删除,但更新仍然是通过直接操作实体本身的属性来执行的(然后从我的存储库)。
出于以下几个原因,我对此感到有些不安:
我认为ObjectContext
应该从存储库模式中替换存储库。感觉就像我在重复实体框架应该为我做的工作。
使用不完整版本的存储库模式(CRUD 中的 C、R 和 D)似乎有点奇怪。存储库不应该用于所有 4 种 CRUD 操作,还是不应该?
实体框架不支持添加/删除通知一定是有原因的。无论如何选择实现它们,是否会造成实体框架开发人员选择避免的设计难题?
作为参考,这里是我的存储库的粗略轮廓:
public class EntityArgs<T> : EventArgs
where T : EntityObject
....
public T Entity
get return this.entity;
public delegate void EntityEventHandler<T>(object sender, EntityArgs<T> args) where T: EntityObject;
public class EntityRepository
public event EntityEventHandler<Foo> FooAdded;
public event EntityEventHandler<Foo> FooDeleted;
...
public EntityRepository()
this.entities = new Entities();
public IEnumerable<Foo> Foos
get return this.entities.Foos;
public void AddFoo(Foo foo)
this.entities.Foos.AddObject(foo);
this.entities.SaveChanges();
this.OnFooAdded(foo);
public void DeleteFoo(Foo foo)
this.entities.Foos.DeleteObject(foo);
this.entities.SaveChanges();
this.OnFooDeleted(foo);
public void SaveChanges()
this.entities.SaveChanges();
...
我对实体框架很陌生,所以如果我的方法完全错误,请告诉我。
编辑:响应 Erix 使用 ObjectStateManager
的建议,它几乎解决了我的问题,但并不完全。问题是我想在entities.Foos
反映更改时收到通知。 ObjectStateManager.ObjectStateManagerChanged
发生在 AddObject
被调用时,但在 SaveChanges
被调用之前。所以:
entities.ObjectStateManager.ObjectStateManagerChanged += (s, e) =>
Console.WriteLine("Action: 0, Object: 1, Count: 2", e.Action, e.Element, entities.Foos.Count());
var foo = ...
Console.WriteLine("Count: 0", entities.Foos.Count());
entities.Foos.AddObject(foo);
entities.Foos.SaveChanged();
Console.WriteLine("Count: 0", entities.Foos.Count());
// Output:
// Count: 0
// Action: Add, Object: ..., Count: 0
// Count: 1
【问题讨论】:
您对哪些活动感兴趣,为什么?从上下文中添加/删除对象,或者从数据库中插入或删除记录? @ProgrammingHero:从上下文中添加/删除的对象。 @ProgrammingHero:至于为什么,我感兴趣的原因有很多。一个简单的例子是,我可以知道何时更新符合某些条件的显示的实体列表。 目前还不清楚你在找什么。您的 cmets 和您编辑的问题看起来相反。 你的问题让我想起了这些:***.com/questions/2714857/… 和 ***.com/questions/2716359/… 【参考方案1】:你能用ObjectStateManager
吗?
它应该在添加对象后引发事件。
显示在 MSDN 中,看起来是正确的方法:
http://msdn.microsoft.com/en-us/library/ee705449.aspx
【讨论】:
这几乎是我需要的,但不完全是。查看我对原始问题的修改。如何修复“ObjectContext 实例已被处置”
】如何修复“ObjectContext实例已被处置”【英文标题】:HowcanIfix"TheObjectContextinstancehasbeendisposed"【发布时间】:2020-06-1001:12:53【问题描述】:我开发了一个带有实体框架的应用程序。我明白了ObjectContext实例已被释放,不能... 查看详情
使用 ObjectContext 获取关系记录的主键
】使用ObjectContext获取关系记录的主键【英文标题】:GetprimarykeyofrelationshiprecordwithObjectContext【发布时间】:2016-03-2113:08:56【问题描述】:我尝试使用EF的ChangeTracker进行审核并保存数据库中的所有更改(添加+更新)。所以使用Chang... 查看详情
使用 Linq to SQL 过滤 objectContext 查询
】使用LinqtoSQL过滤objectContext查询【英文标题】:filteredQueryforobjectContextUsingLinqtoSQL【发布时间】:2014-02-0621:21:06【问题描述】:我试图搜索一些关于我的方法的示例,但所有问题都与我试图实现的目标不够接近。为了TLDR,问题是... 查看详情
添加和删除时DbContext很慢
...库优先的场景中使用DbContext时,我发现添加和删除实体与ObjectContext相比非常慢。如果添加2000个实体并在最后保存更改,则DbContext比ObjectContext慢3到5倍(顺便说一句:我知道使用SqlBulk 查看详情
如果将新对象添加到 ObjectSet,则 ObjectContext.SaveChanges() 永远不会返回。有没有人经历过这个?
】如果将新对象添加到ObjectSet,则ObjectContext.SaveChanges()永远不会返回。有没有人经历过这个?【英文标题】:ObjectContext.SaveChanges()neverreturnsifnewobjectaddedtoanObjectSet.Hasanyoneexperiencedthis?【发布时间】:2012-12-1603:15:18【问题描述】:... 查看详情
n 层项目中的实体框架 ObjectContext 生命周期
】n层项目中的实体框架ObjectContext生命周期【英文标题】:EntityFrameworkObjectContextlifetimeinann-tierproject【发布时间】:2015-06-3016:36:34【问题描述】:我目前正在为客户构建一个大型解决方案,其中代码可重用性是关键字,因为不同... 查看详情
向下转换 ObjectContext 到实体集合
】向下转换ObjectContext到实体集合【英文标题】:DowncastObjectContexttoEntitiescollection【发布时间】:2013-08-0718:40:00【问题描述】:我在EF4.0中使用数据库优先方法创建了一个实体模型。我希望能够在没有app.config文件的情况下使用我的... 查看详情
ObjectContext.Refresh()?
】ObjectContext.Refresh()?【英文标题】:ObjectContext.Refresh()?【发布时间】:2010-12-1708:16:47【问题描述】:如何更新数据存储中的所有脏实体,并将其更改的值重置为原始存储值?ObjectContext.Refresh方法需要将要刷新的实体作为参数。... 查看详情
如何在实体框架中模拟 ObjectContext 或 ObjectQuery<T>?
】如何在实体框架中模拟ObjectContext或ObjectQuery<T>?【英文标题】:HowtomockObjectContextorObjectQuery<T>inEntityFramework?【发布时间】:2010-09-2917:58:31【问题描述】:如何在实体框架中模拟ObjectContext或ObjectQuery?【问题讨论】:除... 查看详情
我应该如何将列表数据添加到网格
】我应该如何将列表数据添加到网格【英文标题】:HowshouldIaddlistdatatoGrid【发布时间】:2022-01-1108:39:11【问题描述】:<GridGrid.Row="1"><Grid.ColumnDefinitions><ColumnDefinition/><ColumnDefinition/><ColumnDefinition/><Colum 查看详情
我应该如何将 TextChangedListener 添加到 EditText 组件?
】我应该如何将TextChangedListener添加到EditText组件?【英文标题】:howshouldIaddaTextChangedListenertoanEditTextcomponent?【发布时间】:2016-01-0109:48:25【问题描述】:我是安卓编程新手。我遇到了一个问题,我很难应用本主题中给出的解决... 查看详情
我应该如何将多个图像添加到视图中?
】我应该如何将多个图像添加到视图中?【英文标题】:HowshouldIaddmultipleimagestoaview?【发布时间】:2014-08-2720:27:43【问题描述】:这是我所拥有的视图的视觉效果。我面临的困境是如何在需要时最好地显示形状(圆形、方形等)... 查看详情
我应该如何添加质量选择器来反应原生视频?
】我应该如何添加质量选择器来反应原生视频?【英文标题】:Howshouldiaddqualityselectortoreactnativevideo?【发布时间】:2020-09-0412:29:35【问题描述】:我已经用react-native-video创建了视频播放器,但是现在我必须为该播放器添加一个质... 查看详情
我应该如何在清单中添加应用程序名称(android)
】我应该如何在清单中添加应用程序名称(android)【英文标题】:HowshouldIaddapplicationnameinmanifest(android)【发布时间】:2015-05-2306:42:07【问题描述】:如何在manifest(android)中添加应用程序名称?<applicationandroid:name=".MainActivity"androi... 查看详情
每组操作的可重用 ObjectContext 还是新的 ObjectContext?
】每组操作的可重用ObjectContext还是新的ObjectContext?【英文标题】:ReuseableObjectContextornewObjectContextforeachsetofoperations?【发布时间】:2010-11-1802:59:45【问题描述】:我是实体框架的新手,我刚开始在空闲时间玩弄它。我遇到的主要... 查看详情
我应该如何将多个控件添加到 WPF 窗口? [复制]
】我应该如何将多个控件添加到WPF窗口?[复制]【英文标题】:HowshouldIaddmultiplecontrolstoaWPFwindow?[duplicate]【发布时间】:2021-03-2916:24:38【问题描述】:免责声明,我对WPF比较陌生。目前,每当我在设计器上放置另一个控件时,所... 查看详情
我应该如何将值添加到具有部分参数的结构中
】我应该如何将值添加到具有部分参数的结构中【英文标题】:howshouldIaddvaluestostructureswithpartialargumentsinsolidity【发布时间】:2021-06-2920:07:49【问题描述】:contractClusterHeadNodestructClusterNodestringname;string[]ordinarynodes;mapping(string=>Clu... 查看详情
java示例代码_我应该如何以及在哪里在代码中添加ActionListener
java示例代码_我应该如何以及在哪里在代码中添加ActionListener 查看详情