Skip to content

Instantly share code, notes, and snippets.

@theuntitled
Last active December 14, 2018 11:12
Show Gist options
  • Save theuntitled/fc68909a9e5e26ffcc1a to your computer and use it in GitHub Desktop.
Save theuntitled/fc68909a9e5e26ffcc1a to your computer and use it in GitHub Desktop.
Elmah v1.2 POCO and Code First Migration
using System.Data.Entity;
using ProjectName.Models;
namespace ProjectName {
public class DataContext : DbContext {
internal DbSet<ElmahError> ElmahErrors { get; set; }
}
}
using System;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;
namespace ProjectName.Models {
[Table( "ELMAH_Error" )]
internal class ElmahError {
[DatabaseGenerated( DatabaseGeneratedOption.Identity )]
public int Sequence { get; set; }
[Key]
public Guid ErrorId { get; set; }
[Required]
[MaxLength( 60 )]
public string Application { get; set; }
[Required]
[MaxLength( 50 )]
public string Host { get; set; }
[Required]
[MaxLength( 100 )]
public string Type { get; set; }
[Required]
[MaxLength( 60 )]
public string Source { get; set; }
[Required]
[MaxLength( 500 )]
public string Message { get; set; }
[Required]
[MaxLength( 50 )]
public string User { get; set; }
public int StatusCode { get; set; }
public DateTime TimeUtc { get; set; }
[Required]
public string AllXml { get; set; }
}
}
using System.Data.Entity.Migrations;
namespace ProjectName.Migrations {
public partial class ElmahErrors : DbMigration {
public override void Up() {
CreateTable(
"dbo.ELMAH_Error" ,
c => new {
ErrorId = c.Guid( false ) ,
Sequence = c.Int( false , true ) ,
Application = c.String( false , 60 ) ,
Host = c.String( false , 50 ) ,
Type = c.String( false , 100 ) ,
Source = c.String( false , 60 ) ,
Message = c.String( false , 500 ) ,
User = c.String( false , 50 ) ,
StatusCode = c.Int( false ) ,
TimeUtc = c.DateTime( false ) ,
AllXml = c.String( false ) ,
} ).PrimaryKey( t => t.ErrorId , "PK_ELMAH_Error" , false );
Sql( "ALTER TABLE dbo.ELMAH_Error ADD CONSTRAINT [DF_ELMAH_Error_ErrorId] DEFAULT (newid()) FOR [ErrorId]" );
Sql(
"CREATE NONCLUSTERED INDEX [IX_ELMAH_Error_App_Time_Seq] ON [dbo].[ELMAH_Error] ( [Application] ASC, [TimeUtc] DESC, [Sequence] DESC )WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]" );
Sql( @"
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
-- Get the ID of the first error for the requested page
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
-- Now set the row count to the requested page size and get
-- all records below it for the pertaining application.
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( @"
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( @"
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( "DROP PROCEDURE [dbo].[ELMAH_GetErrorsXml]" );
Sql( "DROP PROCEDURE [dbo].[ELMAH_GetErrorXml]" );
Sql( "DROP PROCEDURE [dbo].[ELMAH_LogError]" );
Sql( "DROP INDEX [IX_ELMAH_Error_App_Time_Seq] ON dbo.ELMAH_Error WITH ( ONLINE = OFF )" );
Sql( "ALTER TABLE dbo.ELMAH_Error DROP CONSTRAINT [DF_ELMAH_Error_ErrorId]" );
DropTable( "dbo.ELMAH_Error" );
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment