我想使用Entity Framework检查数据库表中的记录是否可删除。如果记录的主键在不同表中用作外键,则该记录不可删除。
我知道我可以运行实体框架的Remove
函数来删除记录并查看是否可以获取具有特定数字的任何SQL异常。但如果成功,它将完全删除记录。这不是我想要的。我只想通过查看具有外键关系的其他表来检查记录是否可删除。
一种非常直接的方法可能是逐个使用导航属性。但我想让它更通用。任何想法都将受到高度赞赏。
答案 0 :(得分:1)
加载originalEntity
所有通过外键指向它的相关端(不是来自它的导航属性,反之亦然):
IEnumerable<IRelatedEnd> relEnds = ((IEntityWithRelationships) originalEntity).RelationshipManager.GetAllRelatedEnds();
foreach (IRelatedEnd relatedEnd in relEnds)
{
if (relatedEnd is EntityReference)
{
continue;
}
relatedEnd.Load();
if (relatedEnd.CreateSourceQuery().OfType<EntityObject>().Any())
{
string exceptionMessage = string.Format("{0} cannot be deleted, because {1} refers to it",
originalEntity.GetType().Name,
relatedEnd.CreateSourceQuery().OfType<EntityObject>().First().GetType().Name);
throw new Exception(exceptionMessage);
}
}
有关详细信息,您可能需要查看MSDN上的RelatedEnd类:
// Collection of entities, you need these when iterating through entity's related ends
public class EntityCollection<TEntity> : RelatedEnd
// Models a relationship end with multiplicity 1.
public abstract class EntityReference : RelatedEnd