【问题标题】: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 )