diff --git a/DigitalData.Core.DTO/BaseDto.cs b/DigitalData.Core.DTO/BaseDto.cs
new file mode 100644
index 0000000..747c521
--- /dev/null
+++ b/DigitalData.Core.DTO/BaseDto.cs
@@ -0,0 +1,17 @@
+namespace DigitalData.Core.DTO
+{
+ ///
+ /// Represents a base Data Transfer Object (DTO) with an identifier.
+ ///
+ /// The type of the identifier.
+ /// The identifier of the DTO.
+ public record BaseDto(TId Id) where TId : notnull
+ {
+ ///
+ /// Returns the hash code for this instance, based on the identifier.
+ /// This override ensures that the hash code is derived consistently from the identifier.
+ ///
+ /// A hash code for the current object, derived from the identifier.
+ public override int GetHashCode() => Id.GetHashCode();
+ }
+}
\ No newline at end of file
diff --git a/DigitalData.Core.Tests/ADServiceTests.cs b/DigitalData.Core.Tests/ADServiceTests.cs
deleted file mode 100644
index f7ec324..0000000
--- a/DigitalData.Core.Tests/ADServiceTests.cs
+++ /dev/null
@@ -1,18 +0,0 @@
-namespace DigitalData.Core.Tests
-{
- [TestFixture]
- public class ADServiceTests
- {
- [SetUp]
- public void Setup()
- {
-
- }
-
- [Test]
- public void ValidateUser_CorrectCredentials_ReturnsTrue()
- {
-
- }
- }
-}
diff --git a/DigitalData.Core.Tests/DTO/BaseDtoTest.cs b/DigitalData.Core.Tests/DTO/BaseDtoTest.cs
new file mode 100644
index 0000000..d9bda02
--- /dev/null
+++ b/DigitalData.Core.Tests/DTO/BaseDtoTest.cs
@@ -0,0 +1,79 @@
+using DigitalData.Core.DTO;
+
+namespace DigitalData.Core.Tests.DTO
+{
+ public class BaseDtoTest
+ {
+ public record SampleDto(int Id) : BaseDto(Id);
+
+ [Test]
+ public void EntitiesWithSameIdShouldBeEqual()
+ {
+ var dto1 = new SampleDto(1);
+ var dto2 = new SampleDto(1);
+
+ Assert.That(dto2, Is.EqualTo(dto1));
+ }
+
+ [Test]
+ public void EntitiesWithDifferentIdsShouldNotBeEqual()
+ {
+ var dto1 = new SampleDto(1);
+ var dto2 = new SampleDto(2);
+
+ Assert.That(dto2, Is.Not.EqualTo(dto1));
+ }
+
+ [Test]
+ public void GetHashCodeShouldReturnSameValueForEntitiesWithSameId()
+ {
+ var dto1 = new SampleDto(1);
+ var dto2 = new SampleDto(1);
+
+ Assert.That(dto2.GetHashCode(), Is.EqualTo(dto1.GetHashCode()));
+ }
+
+ [Test]
+ public void EqualsShouldReturnFalseForNull()
+ {
+ var dto = new SampleDto(1);
+
+ Assert.IsFalse(dto.Equals(null));
+ }
+
+ [Test]
+ public void EqualityOperatorShouldReturnTrueForSameReference()
+ {
+ var dto = new SampleDto(1);
+
+ Assert.That(dto, Is.EqualTo(dto));
+ }
+
+ [Test]
+ public void EqualityOperatorShouldReturnFalseForDifferentEntitiesWithDifferentIds()
+ {
+ var dto1 = new SampleDto(1);
+ var dto2 = new SampleDto(2);
+
+ Assert.IsFalse(dto1 == dto2);
+ }
+
+ [Test]
+ public void InequalityOperatorShouldReturnTrueForDifferentEntitiesWithDifferentIds()
+ {
+ var dto1 = new SampleDto(1);
+ var dto2 = new SampleDto(2);
+
+ Assert.IsTrue(dto1 != dto2);
+ }
+
+ [Test]
+ public void InequalityOperatorShouldReturnFalseForEntitiesWithSameId()
+ {
+ var dto1 = new SampleDto(1);
+ var dto2 = new SampleDto(1);
+
+ Assert.IsFalse(dto1 != dto2);
+ }
+ }
+}
\ No newline at end of file
diff --git a/DigitalData.Core.Tests/DigitalData.Core.Tests.csproj b/DigitalData.Core.Tests/DigitalData.Core.Tests.csproj
index b284f28..a4fb147 100644
--- a/DigitalData.Core.Tests/DigitalData.Core.Tests.csproj
+++ b/DigitalData.Core.Tests/DigitalData.Core.Tests.csproj
@@ -18,4 +18,8 @@
+
+
+
+
diff --git a/DigitalData.Core.sln b/DigitalData.Core.sln
index 8cd090c..7696df0 100644
--- a/DigitalData.Core.sln
+++ b/DigitalData.Core.sln
@@ -13,7 +13,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.Core.API", "Dig
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.Core.Tests", "DigitalData.Core.Tests\DigitalData.Core.Tests.csproj", "{B54DEF90-C30C-44EA-9875-76F1B330CBB7}"
EndProject
-Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DigitalData.Core.DTO", "DigitalData.Core.DTO\DigitalData.Core.DTO.csproj", "{0B051A5F-BD38-47D1-BAFF-D44BA30D3FB7}"
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DigitalData.Core.DTO", "DigitalData.Core.DTO\DigitalData.Core.DTO.csproj", "{0B051A5F-BD38-47D1-BAFF-D44BA30D3FB7}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution