2010-08-17 70 views
2

我正在使用EF 4.0,並且在我的實體數據模型中,我有幾個關係,我有一對多關聯並將關聯標記爲Cascade OnDelete。有沒有一種方法可以通過編程的方式爲實體類型T識別這些關聯?如何識別標記爲級聯的關聯刪除

我想到的一個選擇是識別這些關聯,並在我的T4模板中註釋導航屬性,標識它們是級聯刪除。當然,我需要知道如何確定一個關聯是否在T4模板中標記爲級聯刪除。

回答

3

您可以通過MetadataWorkspace類以編程方式發現比您想要了解的實體模型更多的內容。然而,API是一個挑戰。下面是如何發現的關係(通過導航性能)的一個例子及其相關OnDelete設置:

using (var context = new AppEntities()) 
{ 
    var container = context.MetadataWorkspace.GetEntityContainer("AppEntities", System.Data.Metadata.Edm.DataSpace.CSpace); 

    foreach (var entitySet in container.BaseEntitySets.OfType<EntitySet>()) 
    { 
     var elementType = entitySet.ElementType; 

     foreach (var np in elementType.NavigationProperties) 
     { 
      if (np.FromEndMember.DeleteBehavior == OperationAction.Cascade) 
      { 
       var entityType = np.FromEndMember.GetEntityType(); 

       // do stuff... 
      } 

      if (np.ToEndMember.DeleteBehavior == OperationAction.Cascade) 
      { 
       var entityType = np.ToEndMember.GetEntityType(); 

       // do stuff... 
      } 
     } 
    } 
} 

僅供參考,我覺得上面的代碼可以識別兩次同樣的關係(從一次每端)。

1

丹尼爾的答案將與此相同,但我提供了一個替代解決方案。我做了一些挖掘和發現,你可以在你的POCO是你的T4模板做此項檢查:

// Iterates the Navigation properties for the entity 
foreach (NavigationProperty navProperty in entity.NavigationProperties.Where(np => np.DeclaringType == entity)) 

// Checks if the navigation property is Cascade Delete. 
if (ef.IsCascadeDeletePrincipal(navProperty)) 

我能包含所有我需要知道的信息的檢查中添加註釋。

以編程方式,我會遵循Daniel的示例,但對於模板,我的示例將標識級聯刪除關聯。