如何创建ELMAH SQL Server数据库?

35

我该如何创建 ELMAH SQL Server 数据库?我通过 NuGet 将它添加到我的 ASP.NET MVC 项目中,但是我没有在我的电脑上找到 SQL 脚本。

4个回答

33
DDL脚本可从Elmah的下载页面中获取。无需查找源代码树。
(为什么它没有与NuGet捆绑在一起,我不清楚)

18
我刚刚安装了 Elmah.Mvc 项目(v2.1.1),但它没有创建 App_Readme 文件夹或任何 ddl 脚本。 - Mike Bailey
1
此页面已不存在 :( - peter.swallow
源代码已经移动到 GitHub。请查看我的答案 - Keith Banner
+1 最佳答案,因为您可以选择在GitHub上拉取旧版本的ELMAH以获取其“_MS SQL Server DDL Script_”。其他数据库的脚本也列在他的链接中。 - MikeTeeVee

23

2
请问您能否修复链接并添加摘要?仅有链接的回答价值有限。 - Gert Arnold
2
文件不存在!最新的 URL 是 https://bitbucket.org/project-elmah/main/downloads/ELMAH-1.2-db-SQLServer.sql。 - Wiil
源代码已经迁移到GitHub。请查看我的答案 - Keith Banner

1

1
对于代码优先迁移方案,我发现this文章非常有帮助。
首先在“程序包管理器控制台”中运行Add-Migration AddElmah命令。这将在Migration文件夹下创建一个文件。该文件将包含AddElmah类和两个函数Up()Down()。用以下代码替换这两个函数:
public override void Up()
{
    Sql(@"CREATE TABLE [dbo].[ELMAH_Error]
        (
            [ErrorId]     UNIQUEIDENTIFIER NOT NULL,
            [Application] NVARCHAR(60)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Host]        NVARCHAR(50)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Type]        NVARCHAR(100) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Source]      NVARCHAR(60)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [Message]     NVARCHAR(500) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [User]        NVARCHAR(50)  COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
            [StatusCode]  INT NOT NULL,
            [TimeUtc]     DATETIME NOT NULL,
            [Sequence]    INT IDENTITY(1, 1) NOT NULL,
            [AllXml]      NTEXT COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL
        ) ");

    Sql("EXEC('ALTER TABLE [dbo].[ELMAH_Error] WITH NOCHECK ADD CONSTRAINT[PK_ELMAH_Error] PRIMARY KEY([ErrorId])')");

    Sql("EXEC('ALTER TABLE [dbo].[ELMAH_Error] ADD CONSTRAINT[DF_ELMAH_Error_ErrorId] DEFAULT(NEWID()) FOR[ErrorId]')");

    Sql(@"EXEC('CREATE NONCLUSTERED INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] 
        (
            [Application]   ASC,
            [TimeUtc]       DESC,
            [Sequence]      DESC
        )')");

    Sql(@"EXEC('CREATE PROCEDURE [dbo].[ELMAH_GetErrorXml] (@Application NVARCHAR(60), @ErrorId UNIQUEIDENTIFIER) AS
            SET NOCOUNT ON
            SELECT [AllXml] FROM [ELMAH_Error] WHERE [ErrorId] = @ErrorId AND [Application] = @Application')");

    Sql(@"EXEC('CREATE PROCEDURE [dbo].[ELMAH_GetErrorsXml]
        (@Application NVARCHAR(60), @PageIndex INT = 0, @PageSize INT = 15, @TotalCount INT OUTPUT)
        AS  
            SET NOCOUNT ON 
            DECLARE @FirstTimeUTC DATETIME
            DECLARE @FirstSequence INT
            DECLARE @StartRow INT
            DECLARE @StartRowIndex INT

            SELECT @TotalCount = COUNT(1) FROM [ELMAH_Error] WHERE [Application] = @Application

            SET @StartRowIndex = @PageIndex * @PageSize + 1

            IF @StartRowIndex <= @TotalCount
            BEGIN 
                SET ROWCOUNT @StartRowIndex

                SELECT @FirstTimeUTC = [TimeUtc], @FirstSequence = [Sequence] FROM [ELMAH_Error]
                WHERE [Application] = @Application ORDER BY [TimeUtc] DESC, [Sequence] DESC 
            END
            ELSE
            BEGIN 
                SET @PageSize = 0 
            END

            SET ROWCOUNT @PageSize

            SELECT 
                errorId     = [ErrorId], 
                application = [Application],
                host        = [Host], 
                type        = [Type],
                source      = [Source],
                message     = [Message],
                [user]      = [User],
                statusCode  = [StatusCode], 
                time        = CONVERT(VARCHAR(50), [TimeUtc], 126) + ''Z''
            FROM [ELMAH_Error] error WHERE [Application] = @Application AND [TimeUtc] <= @FirstTimeUTC
            AND [Sequence] <= @FirstSequence ORDER BY [TimeUtc] DESC, [Sequence] DESC FOR XML AUTO')");

    Sql(@"EXEC('CREATE PROCEDURE [dbo].[ELMAH_LogError] (@ErrorId UNIQUEIDENTIFIER, @Application NVARCHAR(60), @Host NVARCHAR(30),
          @Type NVARCHAR(100), @Source NVARCHAR(60), @Message NVARCHAR(500), @User NVARCHAR(50), @AllXml NTEXT, @StatusCode INT,
          @TimeUtc DATETIME) AS 

         SET NOCOUNT ON

         INSERT INTO [ELMAH_Error] ([ErrorId], [Application], [Host], [Type], [Source], [Message], [User], [AllXml], [StatusCode], [TimeUtc])
         VALUES (@ErrorId, @Application, @Host, @Type, @Source, @Message, @User, @AllXml, @StatusCode, @TimeUtc)')");
}

public override void Down()
{
    Sql("EXEC('DROP PROCEDURE [ELMAH_GetErrorXml]')");
    Sql("EXEC('DROP PROCEDURE [ELMAH_GetErrorsXml]')");
    Sql("EXEC('DROP PROCEDURE [ELMAH_LogError]')");
    Sql("Drop table ELMAH_Error");
}

现在,当您在“程序包管理器控制台”中执行Update-Database命令时,将在数据库中创建ELMAH_Error表和相关存储过程。

1
为什么使用newid()而不是newsequentialid()在guid列上设置PK超出了我的理解范围。应该在Sequence列上设置,不是吗? - Greg
我更进一步,使用了带有流畅映射的POCO来生成表的迁移数据。这样做有点复杂,但也允许使用EF直接查询表。 - James Haug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接