实体框架功能的澄清

时间:2015-11-12 13:05:56

标签: c# entity-framework

下面的代码应该怎么做?在此代码中添加包含表的目的是什么,如果它是对PersonId相关的JobType进行级联删除,还是只删除具有指定PersonId的Person?

db.tblPerson.Remove(db.tblPerson.Include("tblJobType").FirstOrDefault(c => c.PersonId== PersonId));

1 个答案:

答案 0 :(得分:2)

在这种情况下,.Include是多余的或非常糟糕的设计。

多余:

  • .Include用于急切加载相关实体(Documentation),因为这会立即传递给.Remove函数,相关实体永远不会被使用,因此它毫无意义。
  • 如果这也是尝试删除相关实体,那将独立于加载相关实体而发生。此效果由关系的级联删除设置决定

糟糕的设计:

  • 因为.Include将加载相关实体,所以需要两个表之间的JOIN。根据Person和JobType之间的关系(例如Optional),这可能会导致人员被排除(例如那些没有JobTypes的人)。

<强>结论

发布的代码只是删除具有指定PersonId的Person。 .Include可能只是一个复制粘贴错误,在这里没有任何影响。如上所述,这不会导致CascadeDelete,这是由不同的设置决定的。但是,您应该注意.Include的副作用。