我应该如何监听从 ObjectContext 添加/删除的实体?

     2023-04-12     276

关键词:

【中文标题】我应该如何监听从 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 查看详情