我有一个与其他实体有1:n或n:m关系的实体,但不是在需要时对数据库进行.Count()调用/查询,我想知道是否有任何EF(6)内置的方法,在添加/删除这些关系时,经常(在我的情况下)将这些访问的计数数字写入一个属性/列中进行非规范化和写入?
有没有办法挂钩到DbContext的DbSet.Add()/ .Remove()机制来做那个或其他任何,可能更优雅的方式?
答案 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 )