如何使用Entity Framework检查记录是否可删除?

时间:2014-04-08 16:34:28

标签: c# entity-framework

我想使用Entity Framework检查数据库表中的记录是否可删除。如果记录的主键在不同表中用作外键,则该记录不可删除。

我知道我可以运行实体框架的Remove函数来删除记录并查看是否可以获取具有特定数字的任何SQL异常。但如果成功,它将完全删除记录。这不是我想要的。我只想通过查看具有外键关系的其他表来检查记录是否可删除。

一种非常直接的方法可能是逐个使用导航属性。但我想让它更通用。任何想法都将受到高度赞赏。

1 个答案:

答案 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类:

http://msdn.microsoft.com/en-us/library/system.data.objects.dataclasses.relatedend%28v=vs.110%29.aspx

// 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