【问题标题】:How do I access the elmah database from code?如何从代码访问 elmah 数据库?
【发布时间】:2015-11-23 12:31:52
【问题描述】:

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访问数据库表了。...:

Private db As New ApplicationDbContext

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

【问题讨论】:

    标签: database vb.net asp.net-mvc-5 datacontext elmah


    【解决方案1】:

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

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

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

    2) 给模型起个名字(很有创意我用了'elmah')> 点击添加

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

    4) 选择elmah连接字符串

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

    5) 点击 Tables 加载 Elmah 表,保持默认设置 > 点击 Finish

    向导会创建 2 个文件并将它们放入项目中。一种以数据表名ELMAH_Error命名;这是模型。另一个是设置上下文的部分类。如果选择了 save connection 选项,则 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 的方法,该函数返回到该方法,我从同一页面上的链接访问该方法。

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

    【讨论】:

      猜你喜欢
      • 2013-04-30
      • 1970-01-01
      • 2013-06-26
      • 2018-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多