注意:VS2010 / .NET 4,但目前没有SP1 Beta,但是如果SP1中的某些功能解决了这个问题,那么仍然很高兴知道。 :)

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

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

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

最佳答案

只有几种方法可以使模型变为只读状态

  • 没有主键的实体是只读的
  • 映射到数据库 View 的实体(无主键)为只读。如果直接在SSDL中使用DefiningQuery,则同样适用。
  • 在CSDL中映射到QueryView的实体是只读的。 QueryView仅在其他实体上起作用,因此,一般而言,它不能解决您的问题。

  • 您的建议具有用户访问数据库的权限,这似乎是最安全的方法。如果您要禁止保存覆盖SaveChanges的更改并抛出类似NotSupportedException的内容,那么这也是一个不错的解决方案。

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

    关于.net - EFv4模型的只读选项(无更改跟踪,应该抛出SaveChanges)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5044780/

    10-13 06:26