删除CascadeOnDelete的公约

时间:2015-01-09 14:10:57

标签: c# entity-framework-6 ef-migrations

我试图在特殊情况下从ForeignKey关系中删除一些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;
  }
}

不幸的是,我不知道如何从Code-First模型中获取POCO-Type 有人可以提供有关如何获得该类型的信息吗?

1 个答案:

答案 0 :(得分: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是否匹配。

实体类型为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;
}