实体框架中的非规范化关系计数

时间:2014-02-06 20:53:06

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

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

有没有办法挂钩到DbContext的DbSet.Add()/ .Remove()机制来做那个或其他任何,可能更优雅的方式?

1 个答案:

答案 0 :(得分:1)

EF中没有内置方式。

我的建议是创建一个计算列,用于计算数据库中的关系计数。这样可以处理计数的数据检索,而不必急于/延迟加载集合,但在保存更改之前对集合执行客户端操作时不会更新计数。要跟踪客户端的更改,我建议将集合nav属性实现为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 )