49 lines
1.3 KiB
C#
49 lines
1.3 KiB
C#
namespace Domain.Common;
|
|
|
|
public class BaseEntity : IHasSequentialId, IHasIsDeleted, IHasAudit
|
|
{
|
|
public string Id { get; set; } = null!;
|
|
public bool IsDeleted { get; set; }
|
|
public DateTime? CreatedAtUtc { get; set; }
|
|
public string? CreatedById { get; set; }
|
|
public DateTime? UpdatedAtUtc { get; set; }
|
|
public string? UpdatedById { get; set; }
|
|
|
|
public BaseEntity()
|
|
{
|
|
Id = GenerateSequentialGuid();
|
|
IsDeleted = false;
|
|
}
|
|
|
|
|
|
|
|
private static readonly object _lock = new object();
|
|
|
|
private string GenerateSequentialGuid()
|
|
{
|
|
byte[] guidArray = Guid.NewGuid().ToByteArray();
|
|
|
|
DateTime baseDate = new DateTime(1900, 1, 1);
|
|
DateTime now = DateTime.UtcNow;
|
|
|
|
TimeSpan timeSpan = now - baseDate;
|
|
byte[] daysArray = BitConverter.GetBytes(timeSpan.Days);
|
|
byte[] msecsArray = BitConverter.GetBytes((long)(timeSpan.TotalMilliseconds % 86400000));
|
|
|
|
if (BitConverter.IsLittleEndian)
|
|
{
|
|
Array.Reverse(daysArray);
|
|
Array.Reverse(msecsArray);
|
|
}
|
|
|
|
lock (_lock)
|
|
{
|
|
Array.Copy(daysArray, daysArray.Length - 2, guidArray, guidArray.Length - 6, 2);
|
|
Array.Copy(msecsArray, msecsArray.Length - 4, guidArray, guidArray.Length - 4, 4);
|
|
}
|
|
|
|
return new Guid(guidArray).ToString();
|
|
}
|
|
}
|
|
|