3

我最近一直在研究在我的 .Net 页面中使用 EF,但是在尝试访问已设置的公共数据库时我有点挣扎。

因此,例如在我的 Oracle SQL 开发人员中,我将访问这样的公共数据库

SELECT name FROM users@publicserver

我正在尝试通过以下方式使用它

Using myEntities As New TestEntities()
    Dim allNames = From name In myEntities.users@publicserver
                     Select name
    GridView1.DataSource = allNames
    GridView1.DataBind()
End Using

显然这不起作用,因为我的 EF 不包含公共服务器表,因为我不确定如何将它添加到 EF(如果这有意义?)

我很想知道是否有可能实现这一目标,如果没有,是否有人对访问它的最佳方法有任何想法?

编辑

理想情况下,如果可能的话,我希望能够将 LINQ 与我的公共数据库链接一起使用?

4

2 回答 2

2

如果您只是从另一个数据库中选择数据,则创建一个视图并将其包含在您的表和视图列表中。如果你想更新、插入或删除数据库,那么你需要考虑几个问题:

  • 两个数据库是否通过快速可靠的链接连接?慢速链接会减慢您的应用程序响应时间。众所周知,不耐烦的用户会一直点击,直到发生某些事情......
  • 如果链接数据库上的事务失败,会有什么后果?整个事务应该失败还是足以记录失败?
  • 当写入不同的数据库时,我更喜欢使用 Oracle 高级队列,以便完成初始数据库上的事务,并且可以单独处理和记录链接数据库上的事务。这不会满足即时同步的要求,但通常要求是很快的一致性,而不是立即的一致性
  • 无论哪种方式,数据库链接上的更新、插入和删除操作都最好在封装链接并将其隐藏在实体框架中的包中处理。

编辑:如果您的连接不像您希望的那样稳定,那么使用高级队列更有意义。有关基础知识,请参阅这篇有些过时的文章。通过使用队列,您可以获得以下功能:

  • 通过将插入/删除/更新放在队列中,应用程序中的操作可以完成,而无需等待确认链接数据库上的辅助事务已成功。
  • 设置队列以跟踪数据库之间的事务尝试了多少次
  • 操作的潜在复杂性不需要由应用程序代码处理。您可以让 EF 做它最擅长的事情:提供数据库接口,而您的其他需求(链接到另一个数据库)由数据库处理。

所有 CRUD 操作都可以封装在 EF 可以使用的数据库包中。

如果您在 11g 数据库上使用最新版本,则可以在没有实体框架的情况下使用 LINQ 和 Oracle。到目前为止,这个版本仍然是新的,所以在生产平台上采用它之前,您可能需要寻找其他用户的意见。

于 2012-07-16T16:30:04.667 回答
2

您是否尝试过使用同义词?

CREATE SYNONYM [dbo].[MyTable] FOR [AnotherDatabase].dbo.[MyTable]

然后你可以写:

SELECT name FROM MyTable

同义词有效,但不会自动检测到逆向工程,因此您需要手动编辑 .edmx 文件以使其正常工作。这是如何做到的

另一种选择是采用 Code First 方法,并使用 [Table] 注释,只需简单地写同义词的名称而不是表的名称

于 2012-07-23T18:13:15.903 回答