【问题标题】:Denormalizing relationship counts in Entity Framework实体框架中的非规范化关系计数
【发布时间】:2014-03-04 01:01:25
【问题描述】:

我有一个与其他实体有 1:n 或 n:m 关系的实体,但我没有在需要时对数据库执行 .Count() 调用/查询,我想知道是否有任何 EF (6) 内置在添加/删除此类关系时,将这些经常(在我的情况下)访问的计数数字非规范化并写入属性/列的方法?

有没有什么方法可以挂钩到 DbContext 的 DbSet.Add() / .Remove() 机制来做到这一点或任何其他,也许更优雅的方式?

【问题讨论】:

    标签: c# entity-framework entity-relationship denormalization


    【解决方案1】:

    EF 中没有内置方式。

    我的建议是创建一个计算列来计算数据库中的关系计数。这将负责计数的数据检索,而不必急切/延迟加载集合,但在保存更改之前对集合执行客户端操作时不会更新计数。为了在客户端跟踪更改,我建议将集合导航属性实现为ObservableCollection<T>。处理 CollectionChanged 事件以相应地更新 POCO 的 RelationshipCount 属性。

    POCO 属性和方法:

    public virtual ObservableCollection<RelatedEntity> RelatedEntities { get; set; }
    
    [DatabaseGenerated( DatabaseGeneratedOption.Computed )]
    public int RelationshipCount { get; set; }
    
    void RelatedEntities_CollectionChanged( object sender, NotifyCollectionChangedEventArgs e )
    {
        var col = sender as ReadOnlyObservableCollection<RelatedEntity>;
    
        RelatedEntities = col.Count();
    }
    

    在您的数据库中创建一个 UDF 以计算计数值:

    create function dbo.udfGetRelationshipCount( @id int )
    returns int
    as
        declare @count int
    
        select @count = count(*)
        from
            dbo.RelatedEntity
        where
            EntityId = @id
    
        return @count
    

    添加列:

    alter table dbo.Entity
        ADD RelationshipCount as dbo.udfGetRelationshipCount( EntityId )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 2020-05-21
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多