2014-02-06 39 views
0

我有一個與其他實體具有1:n或n:m關係的實體,但不必在需要時對數據庫執行.Count()調用/查詢,我在想是否有任何EF(6)內置方法來反規範化和寫這些經常(在我的情況下)訪問計數數字到一個屬性/列一旦添加/刪除這樣的關係?實體框架中的非規範化關係計數

有沒有什麼辦法掛鉤到DbContext的DbSet.Add()/ .Remove()機制來做到這一點或任何其他,也許更優雅的方式?

回答

1

EF中沒有內置的方法。

我的建議是創建一個計算列,計算DB中的關係數。這將負責數據的數據檢索,而無需在保存更改之前對集合執行客戶端操作時不必急於/延遲加載收集,而是不更新計數。爲了跟蹤客戶端的變化,我建議實施collection nav屬性作爲ObservableCollection<T>。處理CollectionChanged事件以相應地更新POCO的RelationshipCount屬性。

POCO的屬性和方法:

create function dbo.udfGetRelationshipCount(@id int) 
returns int 
as 
    declare @count int 

    select @count = count(*) 
    from 
     dbo.RelatedEntity 
    where 
     EntityId = @id 

    return @count 

添加列:

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

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

噢,那是不錯的確,謝謝! –