如何从代码访问 elmah 数据库?

How do I access the elmah database from code?

VS2013 更新 4,MVC5,elmah.mvc(与 elmah 相同),VB/C#

以下代码是入门标准 MVC 模板的一部分,也是从代码内部设置数据库连接以访问 SQL 数据库的一部分:

Public Class ApplicationDbContext
  Inherits IdentityDbContext(Of ApplicationUser)
  Public Sub New()
    MyBase.New("DefaultConnection", throwIfV1Schema:=False)
    Me.Configuration.LazyLoadingEnabled = True
  End Sub

  Public Shared Function Create() As ApplicationDbContext
    Return New ApplicationDbContext()
  End Function

我们还需要 web.config 中的以下内容或类似内容:

<configuration>
  <connectionStrings>
    <add name="DefaultConnection" connectionString="Data Source=mypc\SQLEXPRESS;Initial Catalog=mydb.DefaultContext;Integrated Security=True" providerName="System.Data.SqlClient" />
    <add name="ElmahConnection" connectionString="Data Source=mypc\SQLEXPRESS;Initial Catalog=mydb.elmah;Integrated Security=True" providerName="System.Data.SqlClient" />
  </connectionStrings>

我添加了 elmah 连接字符串,因为它与我的问题相关。

然后在每个需要的地方,添加下面的定义,我们就可以使用db访问数据库tables。< tablename>...:[=​​13=]

Private db As New ApplicationDbContext

我想编写一些方法来处理 elmah 数据 table 但它与 ApplicationContext 是不同的上下文。我不太明白我会写什么来设置与 elmah 的连接 table,因为我并没有真正设置它,它出现在 elmah 的 dll 中。

虽然保留错误记录是有道理的,但在开发过程中我想清除 Elmah 日志。虽然对大多数人来说可能微不足道,但这是一个很好的练习。我太习惯先编码了,我忘了 EF 也先做数据库。

在 VS2013 更新 4 中,以下向导使这项任务变得非常简单。

1) 项目 > 添加新项 > 数据 > ADO.NET 实体数据模型

2) 给模型起个名字(创意十足的我用了'elmah') > 点击Add

3) 这是非常酷的地方。我不确定它是何时添加的,但 EF 框架现在包含一个名为 Code First From Database 的新选项。点击那个。

4) Select elmah 连接字符串

注意:在 web.config 中有一个 保存连接设置的选项。这只会创建一个重复的连接字符串。保持选中状态或不选中状态,但使用现有字符串就可以了。我没有 select 这个选项, web.config 没有动过。但是,不使用该选项意味着必须在上下文定义中更新连接字符串名称 > 单击下一步

5) 单击 Tables 加载 Elmah table,保留默认值 > 单击 Finish

向导创建 2 个文件并将它们放入项目中。一个是用数据table命名的,名字是ELMAH_Error;这是模型。另一个是设置上下文的parita class。如果 保存连接 选项被 select 编辑,那么 web.config 将被修改以添加新的连接字符串。 注意:为方便起见,我将 2 类 合并到一个文件中(可能需要添加一些 Using 或 Imports),而 Public Sub New() 是连接字符串名称必须更新的地方,如果现有连接字符串使用如下所示。

Partial Public Class elmah
  Inherits DbContext

  Public Sub New()
    MyBase.New("name=ElmahConnection")
  End Sub

  Public Overridable Property ELMAH_Error As DbSet(Of ELMAH_Error)

  Protected Overrides Sub OnModelCreating(ByVal modelBuilder As DbModelBuilder)
  End Sub
End Class

6) 所有这些都是自动完成的(如果需要,连接字符串名称除外),所需要的只是编写所需的代码。我想不时清空 elmah 日志并使用以下内容:

Public Class ErrorController
  Inherits Controller

  Private db1 As New elmah

Function DeleteElmahRecords() As ActionResult

  Dim elmahTable = db1.ELMAH_Error.ToList()
  db1.ELMAH_Error.RemoveRange(elmahTable)
  db1.SaveChanges()

  Return RedirectToAction("ErrorTesting")
End Function
…
End Class

显然,我有一个名为 ErrorTesting 的方法,函数 returns 到我从同一页面上的 link 访问此方法。

希望这对某人有用。考虑到我经常从这个网站得到的很棒的专家帮助,这是我可以回馈的唯一方式。