c# – 实体框架6:检测关系变化

c# – 实体框架6:检测关系变化,第1张

概述在我的DbContext子类中,我重写了SaveChanges()方法,因此我可以实现一种类似触发器的功能(在实际保存更改之前). 现在,在某些触发器中,有必要检测某些关系是否已经改变,无论多对多,一对一/零等. 我已经阅读了互联网上的一些帖子,包括本网站上的一些帖子,提到DbContext API没有公开任何获取关系信息的方法. 但是,ObjectContext应该能够. 我的SaveChang 在我的DbContext子类中,我重写了SaveChanges()方法,因此我可以实现一种类似触发器的功能(在实际保存更改之前).
现在,在某些触发器中,有必要检测某些关系是否已经改变,无论多对多,一对一/零等.

我已经阅读了互联网上的一些帖子,包括本网站上的一些帖子,提到DbContext API没有公开任何获取关系信息的方法.
但是,ObjectContext应该能够.

我的SaveChanges方法:

public overrIDe int SaveChanges(){    IEntity entity;    ChangeTracker.DetectChanges();    var stateManager = ((IObjectContextAdapter)this).ObjectContext.ObjectStateManager;    var added = stateManager.GetobjectStateEntrIEs(EntityState.Added).ToList();    var updated = stateManager.GetobjectStateEntrIEs(EntityState.ModifIEd).ToList();    var deleted = stateManager.GetobjectStateEntrIEs(EntityState.Deleted).ToList();    var unchanged = stateManager.GetobjectStateEntrIEs(EntityState.Unchanged).ToList();    while ((entity = _entitIEsRequiringTriggering.FirstOrDefault(x => x.Value).Key) != null)    {        _entitIEsRequiringTriggering[entity] = false;        var entry = ChangeTracker.EntrIEs<IEntity>().SingleOrDefault(x => x.State != EntityState.Unchanged && x.Entity == entity);        if (entry == null) continue;        var trigger = Triggers.Triggers.GetTriggerForEntity(entry.Entity,this);        if (trigger == null) continue;        trigger.BeforeSave(entry.Entity);        switch (entry.State)        {            case EntityState.Added:                trigger.BeforeAdd(entry.Entity);                break;            case EntityState.ModifIEd:                trigger.BeforeUpdate(entry.Entity);                break;            case EntityState.Deleted:                trigger.BeforeDelete(entry.Entity);                break;        }    }    return base.SaveChanges();}

请注意添加,更新,删除和更改的四个变量.
根据我到目前为止所发现的,GetobjectStateEntrIEs应该返回ObjectStateEntry的集合,该集合具有IsRelationship属性.

我在测试应用程序中运行以下代码:

using (var db = container.Resolve<IDatabaseContext>()){    var cus = db.query<Customer>().Single(x => x.ID == 1);    var newAddress = db.query<Address>().Single(x => x.ID == 5);    cus.Address = newAddress; //also sets the foreign key property Customer.AddressID to its new corresponding value    db.SaveChanges();}

当我在调用后检查SaveChanges中的代码时,我得到了预期的结果:
一个结果在更新列表中,Customer对象.
但在任何时候,我都没有获得关系(一对一)Customer_Address的ObjectStateEntry.

我需要能够在关系发生变化时如前所述进行检测.
对于正常的标量属性,您可以这样做:

var changed = DbEntry.Property(x => x.name).OriginalValue == DbEntry.Property(x => x.name).CurrentValue;

但对于不明显起作用的参考属性.
有任何想法吗?

解决方法 您可以使用此ExtensionMethod获取已更改的关系列表
public static class DbContextExtensions{    public static IEnumerable<Tuple<object,object>> GetRelationships(        this DbContext context)    {        return GetAddedRelationships(context)                .Union(GetDeletedRelationships(context));    }    public static IEnumerable<Tuple<object,object>> GetAddedRelationships(        this DbContext context)    {        return GetRelationships(context,EntityState.Added,(e,i) => e.CurrentValues[i]);    }    public static IEnumerable<Tuple<object,object>> GetDeletedRelationships(        this DbContext context)    {        return GetRelationships(context,EntityState.Deleted,i) => e.OriginalValues[i]);    }    private static IEnumerable<Tuple<object,object>> GetRelationships(        this DbContext context,EntityState relationshipState,Func<ObjectStateEntry,int,object> getValue)    {        context.ChangeTracker.DetectChanges();        var objectContext = ((IObjectContextAdapter)context).ObjectContext;        return objectContext.ObjectStateManager                            .GetobjectStateEntrIEs(relationshipState)                            .Where(e => e.IsRelationship)                            .Select(                                    e => Tuple.Create(                                            objectContext.GetobjectByKey((EntityKey)getValue(e,0)),objectContext.GetobjectByKey((EntityKey)getValue(e,1))));    }}
总结

以上是内存溢出为你收集整理的c# – 实体框架6:检测关系变化全部内容,希望文章能够帮你解决c# – 实体框架6:检测关系变化所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1248946.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存