【问题标题】:options for a read-only (no change tracking, SaveChanges should throw) EFv4 model?只读(无更改跟踪,SaveChanges 应该抛出)EFv4 模型的选项?
【发布时间】:2011-02-18 17:53:38
【问题描述】:

注意:VS2010 / .NET 4,但目前没有 SP1 Beta,但如果 SP1 中的某些内容解决了这个问题,那么了解它仍然是一件好事。 :)

我有一个特定的数据库,我想从中读取但永远不会写入。我没有在模型的属性中看到任何东西(在 EF 设计器中查看)将其标记为只读。

当然,看起来最简单的事情是为生成的 ObjectContext 子类(类 FooModel : ObjectContext)添加一个部分类来覆盖 SaveChanges(SaveOptions) 并让它抛出(也许连接到 SavingChanges 并抛出也可以,我也没有真正尝试过)。这不会禁用更改跟踪,并且 AFAICT 我必须遍历上下文实例创建时的所有实体集,以将它们全部标记为只读(尽管这是一个性能问题,因此不如确保更改不那么重要) t 坚持)。

当然还有其他选项,例如让连接字符串以仅具有读取访问权限的用户身份连接,但我想知道从 EF 设计器/模型/实例的角度来看,哪些选项可用于拥有“只读”对象上下文?

【问题讨论】:

    标签: .net visual-studio-2010 entity-framework linq-to-entities


    【解决方案1】:

    只有几种方法可以让你的模型只读

    • 没有主键的实体是只读的
    • 映射到数据库视图(无主键)的实体是只读的。如果您直接在 SSDL 中使用 DefiningQuery,同样适用。
    • 在 CSDL 中映射到 QueryView 的实体是只读的。 QueryView 仅适用于其他实体,因此这通常无法解决您的问题。

    您对用户访问数据库权限的建议看起来是最安全的方式。如果您想禁止保存覆盖SaveChanges 的更改并抛出类似NotSupportedException 的内容,看起来也是一个不错的解决方案。

    因为您将只使用只读实体,您还可以通过使用MergeOptions.NoTracking 来提高查询性能。

    【讨论】:

    • WRT ul 列表:是的,这些都是可行的,我只是真的希望模型级别的东西可用,而不是必须在实体和/或实体集上做事。那好吧。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-07-31
    • 2017-07-14
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多