删除 CascadeOnDelete 的约定
Convention to remove 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 类型。
有人可以提供有关如何获得该类型的信息吗?
我找到了一个解决方案来获取 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;
}
我正在尝试在特殊情况下从外键关系中删除一些 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 类型。
有人可以提供有关如何获得该类型的信息吗?
我找到了一个解决方案来获取 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;
}