我一直在考虑如何使用实体框架实现行级安全性.我们的想法是拥有一个数据库不可知的方法,它将提供限制来自ObjectContext的行的方法.
我的一些初步想法涉及修改EDMGEN工具创建的部分类,并提供了一些有限的支持.用户仍然可以使用自己的eSQL语句和QueryObject来解决此问题.
我一直在寻找一种全面的解决方案,它将存在于数据库提供商之上,以便它仍然是不可知的.
当然你可以做到.重要的是阻止直接访问对象上下文(阻止用户构建自己的ObjectQuery),而是为客户端提供一个更窄的网关,在其中访问和改变实体.我们使用Entity Repository模式执行此操作.您可以在此博客文章中找到实体框架的此模式的示例实现.同样,关键是阻止访问对象上下文.请注意,对象上下文类是部分的.因此,您应该能够防止"未经授权"实例化它,即在您的存储库程序集之外.
但是,需要考虑细微之处.如果通过存储库模式对某个实体类型实现行级视图安全性,则必须考虑客户端可以访问相同实体的其他方法.例如,通过导航关系.您可能需要将其中一些关系设为私有,您可以在模型中执行此操作.您还可以选择指定用于加载/保存实体的自定义查询或存储过程.存储过程往往是特定于DB服务器的,但SQL可以以通用方式编写.
虽然我不同意实体框架无法做到这一点,但我同意"在数据库服务器上做它"的评论,因为你应该深入实施防御.