2015-01-09 67 views
1

我想在特殊情況下從外鍵關係中刪除一些CascadeOnDelete標記。約定刪除CascadeOnDelete

這種情況是,如果關係的一端是特定類型而另一端不是,那麼我想將cascadeOnDelete設置爲false。

class CascadeOnDeleteSuppressionConvention : IConceptualModelConvention<AssociationType>, IConvention 
{ 
    public void Apply(AssociationType associationType, DbModel model) 
    { 
    if(!associationType.IsForeignKey) 
     return; 

    if(associationType.AssociationEndMembers[0].GetPOCOType() == typeof(someType) && 
     associationType.AssociationEndMembers[1].GetPOCOType() != typeof(someTypeOtherType)) 
     associationType.AssociationEndMembers[0].DeleteAction = DeleteAction.None; 
    } 
} 

不幸的是,我不知道如何從代碼優先模型中獲得POCO類型。
有人可以提供有關如何獲得該類型的信息嗎?

回答

1

我發現了一個解決方案,可以從我的應用程序中獲得ConceptualModel的EntityType和CLRType之間的映射。

ConceptualModel.EntityTypes裏面是可用的元數據,在這裏適合我的需要:

public EntityType FindEntityType(DbModel model, Type type) 
{ 
    var const metadataPropertyName = "http://schemas.microsoft.com/ado/2013/11/edm/customannotation:ClrType"; 

    var entityType = model.ConceptualModel.EntityTypes.SingleOrDefault(
     e => e.MetadataProperties.Contains(metadataPropertyName) && 
      e.MetadataProperties.GetValue(metadataPropertyName).Value as Type == type 
     ); 

    return entityType; 
} 

剪斷該代碼可以用來獲取必要的信息,並檢查的EntityType匹配。

的的EntityType到ClrType代碼

public Type GetClrType(EntityType entityType) 
{ 
    const string metadataPropertyName = "http://schemas.microsoft.com/ado/2013/11/edm/customannotation:ClrType"; 

    MetadataProperty metadataProperty; 
    if (entityType.MetadataProperties.TryGetValue(metadataPropertyName, true, out metadataProperty)) 
     return metadataProperty.Value as Type; 

    return null; 
}