1

我可能完全误解了 RX 的全部含义,但我认为这将是一种允许我的代码中的各种客户端应用程序订阅更改某些实体框架代码优先类型的通知的好方法。

所以在我的 UOW Commit 方法中,我有

        var changes = DbContext.ChangeTracker.Entries<EntEvent>().Where(ee => ee.State != EntityState.Unchanged);
        Hub.Instance.NotifyBeforeSave(changes);

我的(相当基本的)集线器类看起来像这样......

public sealed class Hub
{
    private static readonly Hub instance = new Hub();
    static Hub(){}
    private Hub(){}
    public static Hub Instance
    {
        get { return instance; }
    }

    public IObservable<System.Data.Entity.Infrastructure.DbEntityEntry<EntEvent>> BeforeSave = new Subject<DbEntityEntry<EntEvent>>(); 
    public void NotifyBeforeSave<T>(IEnumerable<System.Data.Entity.Infrastructure.DbEntityEntry<T>> changes) where T:class
    {
        var  x = changes.Where(c => typeof(T) == typeof(EntEvent)) as IEnumerable<System.Data.Entity.Infrastructure.DbEntityEntry<EntEvent>>;
        BeforeSave = x.ToObservable();
    }
}

然后我想我可以通过创建以下实例并调用附加来订阅客户端(观察者)。

public class SampleConsumer : IObserver<DbEntityEntry<EntEvent>>
{
    public void attach()
    {            
        Hub.Instance.BeforeSave.Subscribe(this);
    }

    public void OnNext(DbEntityEntry<EntEvent> value)
    {
        var x = value;
    }

    public void OnError(Exception error)
    {
        var y = error;
    }

    public void OnCompleted()
    {
    }
}

但是 OnNext 和 OnError 中的断点永远不会被调用。

我可能离我应该去的地方有 180 度,但我们必须从某个地方开始!

4

2 回答 2

1

问题是您没有异步源。

DbContext.ChangeTracker.Entries<EntEvent>()

是一个集合。您可以使用将其转换为可观察的

IEnumerble.ToObservable();

但这并不能使它异步。事实上,它会在订阅时立即枚举集合。如果集合碰巧是空的,它什么也不做。谷歌冷/热可观察物之间的区别来理解。您需要一个异步源,例如事件。

我不太了解EF,我的猜测是

((IObjectContextAdapter)DbContext).ObjectContext.SavingChanges

事件可能是你需要的。

祝你好运!

于 2013-07-05T11:24:11.943 回答
1

插上尼克的

https://github.com/NickStrupat/EntityFramework.Triggers https://github.com/NickStrupat/EntityFramework.Rx

他有来自和不来自他的上下文的模式,这允许:

DbObservable<Context>.FromInserted<Person>();
于 2015-12-12T18:46:56.953 回答