diff --git a/.config/dotnet-tools.json b/.config/dotnet-tools.json new file mode 100644 index 0000000..321b5d6 --- /dev/null +++ b/.config/dotnet-tools.json @@ -0,0 +1,13 @@ +{ + "version": 1, + "isRoot": true, + "tools": { + "csharpier": { + "version": "1.1.2", + "commands": [ + "csharpier" + ], + "rollForward": false + } + } +} \ No newline at end of file diff --git a/DataAccessLayer-Tests/DataAccessLayer-Tests.csproj b/DataAccessLayer-Tests/DataAccessLayer-Tests.csproj deleted file mode 100644 index 9c5b30a..0000000 --- a/DataAccessLayer-Tests/DataAccessLayer-Tests.csproj +++ /dev/null @@ -1,23 +0,0 @@ - - - - net8.0 - enable - enable - - false - true - - - - - - - - - - - - - - diff --git a/DataAccessLayer/BeerPost.cs b/DataAccessLayer/BeerPost.cs deleted file mode 100644 index 3242b91..0000000 --- a/DataAccessLayer/BeerPost.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BeerPost -{ - public Guid BeerPostID { get; set; } - - public string Name { get; set; } = null!; - - public string Description { get; set; } = null!; - - public decimal ABV { get; set; } - - public int IBU { get; set; } - - public Guid PostedByID { get; set; } - - public Guid BeerStyleID { get; set; } - - public Guid BrewedByID { get; set; } - - public DateTime CreatedAt { get; set; } - - public DateTime? UpdatedAt { get; set; } - - public virtual ICollection BeerPostPhotos { get; set; } = new List(); - - public virtual BeerStyle BeerStyle { get; set; } = null!; - - public virtual BreweryPost BrewedBy { get; set; } = null!; - - public virtual UserAccount PostedBy { get; set; } = null!; -} diff --git a/DataAccessLayer/BeerPostPhoto.cs b/DataAccessLayer/BeerPostPhoto.cs deleted file mode 100644 index cdb8963..0000000 --- a/DataAccessLayer/BeerPostPhoto.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BeerPostPhoto -{ - public Guid BeerPostPhotoID { get; set; } - - public Guid BeerPostID { get; set; } - - public Guid PhotoID { get; set; } - - public DateTime LinkedAt { get; set; } - - public virtual BeerPost BeerPost { get; set; } = null!; - - public virtual Photo Photo { get; set; } = null!; -} diff --git a/DataAccessLayer/BeerStyle.cs b/DataAccessLayer/BeerStyle.cs deleted file mode 100644 index 4af1a81..0000000 --- a/DataAccessLayer/BeerStyle.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BeerStyle -{ - public Guid BeerStyleID { get; set; } - - public string StyleName { get; set; } = null!; - - public string? Description { get; set; } - - public virtual ICollection BeerPosts { get; set; } = new List(); -} diff --git a/DataAccessLayer/BiergartenContext.cs b/DataAccessLayer/BiergartenContext.cs deleted file mode 100644 index 883a87d..0000000 --- a/DataAccessLayer/BiergartenContext.cs +++ /dev/null @@ -1,300 +0,0 @@ -using System; -using System.Collections.Generic; -using Microsoft.EntityFrameworkCore; - -namespace DataAccessLayer; - -public partial class BiergartenContext : DbContext -{ - public BiergartenContext() - { - } - - public BiergartenContext(DbContextOptions options) - : base(options) - { - } - - public virtual DbSet BeerPosts { get; set; } - - public virtual DbSet BeerPostPhotos { get; set; } - - public virtual DbSet BeerStyles { get; set; } - - public virtual DbSet BreweryPosts { get; set; } - - public virtual DbSet BreweryPostPhotos { get; set; } - - public virtual DbSet Comments { get; set; } - - public virtual DbSet Photos { get; set; } - - public virtual DbSet UserAccounts { get; set; } - - public virtual DbSet UserAvatars { get; set; } - - public virtual DbSet UserCredentials { get; set; } - - public virtual DbSet UserFollows { get; set; } - - public virtual DbSet UserVerifications { get; set; } - - protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) -#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see https://go.microsoft.com/fwlink/?LinkId=723263. - => optionsBuilder.UseSqlServer("Server=(localdb)\\ProjectModels;Database=Biergarten;Trusted_Connection=True;"); - - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.Entity(entity => - { - entity.ToTable("BeerPost"); - - entity.HasIndex(e => e.BeerStyleID, "IX_BeerPost_BeerStyle"); - - entity.HasIndex(e => e.BrewedByID, "IX_BeerPost_BrewedBy"); - - entity.HasIndex(e => e.PostedByID, "IX_BeerPost_PostedBy"); - - entity.Property(e => e.BeerPostID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.ABV).HasColumnType("decimal(4, 2)"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - entity.Property(e => e.Name).HasMaxLength(100); - entity.Property(e => e.UpdatedAt).HasColumnType("datetime"); - - entity.HasOne(d => d.BeerStyle).WithMany(p => p.BeerPosts) - .HasForeignKey(d => d.BeerStyleID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BeerPost_BeerStyle"); - - entity.HasOne(d => d.BrewedBy).WithMany(p => p.BeerPosts) - .HasForeignKey(d => d.BrewedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BeerPost_Brewery"); - - entity.HasOne(d => d.PostedBy).WithMany(p => p.BeerPosts) - .HasForeignKey(d => d.PostedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BeerPost_PostedBy"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BeerPostPhoto"); - - entity.HasIndex(e => new { e.BeerPostID, e.PhotoID }, "IX_BeerPostPhoto_BeerPost_Photo"); - - entity.HasIndex(e => new { e.PhotoID, e.BeerPostID }, "IX_BeerPostPhoto_Photo_BeerPost"); - - entity.Property(e => e.BeerPostPhotoID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.LinkedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.BeerPost).WithMany(p => p.BeerPostPhotos) - .HasForeignKey(d => d.BeerPostID) - .HasConstraintName("FK_BeerPostPhoto_BeerPost"); - - entity.HasOne(d => d.Photo).WithMany(p => p.BeerPostPhotos) - .HasForeignKey(d => d.PhotoID) - .HasConstraintName("FK_BeerPostPhoto_Photo"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BeerStyle"); - - entity.HasIndex(e => e.StyleName, "AK_BeerStyle_StyleName").IsUnique(); - - entity.Property(e => e.BeerStyleID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.StyleName).HasMaxLength(100); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BreweryPost"); - - entity.HasIndex(e => e.PostedByID, "IX_BreweryPost_PostedByID"); - - entity.Property(e => e.BreweryPostID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - entity.Property(e => e.Description).HasMaxLength(512); - entity.Property(e => e.UpdatedAt).HasColumnType("datetime"); - - entity.HasOne(d => d.PostedBy).WithMany(p => p.BreweryPosts) - .HasForeignKey(d => d.PostedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_BreweryPost_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("BreweryPostPhoto"); - - entity.HasIndex(e => new { e.BreweryPostID, e.PhotoID }, "IX_BreweryPostPhoto_BreweryPost_Photo"); - - entity.HasIndex(e => new { e.PhotoID, e.BreweryPostID }, "IX_BreweryPostPhoto_Photo_BreweryPost"); - - entity.Property(e => e.BreweryPostPhotoID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.LinkedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.BreweryPost).WithMany(p => p.BreweryPostPhotos) - .HasForeignKey(d => d.BreweryPostID) - .HasConstraintName("FK_BreweryPostPhoto_BreweryPost"); - - entity.HasOne(d => d.Photo).WithMany(p => p.BreweryPostPhotos) - .HasForeignKey(d => d.PhotoID) - .HasConstraintName("FK_BreweryPostPhoto_Photo"); - }); - - modelBuilder.Entity(entity => - { - entity.HasKey(e => e.CommentID).HasName("PK_CommentID"); - - entity.ToTable("Comment"); - - entity.HasIndex(e => e.PostedByID, "IX_Comment_PostedByID"); - - entity.Property(e => e.CommentID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CommentText).HasMaxLength(512); - - entity.HasOne(d => d.PostedBy).WithMany(p => p.Comments) - .HasForeignKey(d => d.PostedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_PostedByID"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("Photo"); - - entity.HasIndex(e => e.UploadedByID, "IX_Photo_UploadedByID"); - - entity.Property(e => e.PhotoID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.Hyperlink).HasMaxLength(256); - entity.Property(e => e.UploadedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.UploadedBy).WithMany(p => p.Photos) - .HasForeignKey(d => d.UploadedByID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_Photo_UploadedBy"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserAccount"); - - entity.HasIndex(e => e.Email, "AK_Email").IsUnique(); - - entity.HasIndex(e => e.Username, "AK_Username").IsUnique(); - - entity.Property(e => e.UserAccountID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt).HasColumnType("datetime"); - entity.Property(e => e.DateOfBirth).HasColumnType("datetime"); - entity.Property(e => e.Email) - .HasMaxLength(128) - .IsUnicode(false); - entity.Property(e => e.FirstName).HasMaxLength(128); - entity.Property(e => e.LastName).HasMaxLength(128); - entity.Property(e => e.UpdatedAt).HasColumnType("datetime"); - entity.Property(e => e.Username) - .HasMaxLength(64) - .IsUnicode(false); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserAvatar"); - - entity.HasIndex(e => e.UserAccountID, "AK_UserAvatar_UserAccountID").IsUnique(); - - entity.HasIndex(e => e.UserAccountID, "IX_UserAvatar_UserAccount"); - - entity.Property(e => e.UserAvatarID).HasDefaultValueSql("(newid())"); - - entity.HasOne(d => d.Photo).WithMany(p => p.UserAvatars) - .HasForeignKey(d => d.PhotoID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_UserAvatar_PhotoID"); - - entity.HasOne(d => d.UserAccount).WithOne(p => p.UserAvatar) - .HasForeignKey(d => d.UserAccountID) - .HasConstraintName("FK_UserAvatar_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserCredential"); - - entity.HasIndex(e => e.UserAccountID, "AK_UserCredential_UserAccountID").IsUnique(); - - entity.HasIndex(e => e.UserAccountID, "IX_UserCredential_UserAccount"); - - entity.Property(e => e.UserCredentialID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - entity.Property(e => e.Expiry) - .HasDefaultValueSql("(dateadd(day,(90),getdate()))") - .HasColumnType("datetime"); - entity.Property(e => e.Hash).HasMaxLength(100); - - entity.HasOne(d => d.UserAccount).WithOne(p => p.UserCredential) - .HasForeignKey(d => d.UserAccountID) - .HasConstraintName("FK_UserCredential_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserFollow"); - - entity.HasIndex(e => new { e.FollowingID, e.UserAccountID }, "IX_UserFollow_FollowingID_UserAccount"); - - entity.HasIndex(e => new { e.UserAccountID, e.FollowingID }, "IX_UserFollow_UserAccount_FollowingID"); - - entity.Property(e => e.UserFollowID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.CreatedAt) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.Following).WithMany(p => p.UserFollowFollowings) - .HasForeignKey(d => d.FollowingID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_UserFollow_UserAccountFollowing"); - - entity.HasOne(d => d.UserAccount).WithMany(p => p.UserFollowUserAccounts) - .HasForeignKey(d => d.UserAccountID) - .OnDelete(DeleteBehavior.ClientSetNull) - .HasConstraintName("FK_UserFollow_UserAccount"); - }); - - modelBuilder.Entity(entity => - { - entity.ToTable("UserVerification"); - - entity.HasIndex(e => e.UserAccountID, "AK_UserVerification_UserAccountID").IsUnique(); - - entity.HasIndex(e => e.UserAccountID, "IX_UserVerification_UserAccount"); - - entity.Property(e => e.UserVerificationID).HasDefaultValueSql("(newid())"); - entity.Property(e => e.VerificationDateTime) - .HasDefaultValueSql("(getdate())") - .HasColumnType("datetime"); - - entity.HasOne(d => d.UserAccount).WithOne(p => p.UserVerification) - .HasForeignKey(d => d.UserAccountID) - .HasConstraintName("FK_UserVerification_UserAccount"); - }); - - OnModelCreatingPartial(modelBuilder); - } - - partial void OnModelCreatingPartial(ModelBuilder modelBuilder); -} diff --git a/DataAccessLayer/BreweryPost.cs b/DataAccessLayer/BreweryPost.cs deleted file mode 100644 index c706b98..0000000 --- a/DataAccessLayer/BreweryPost.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BreweryPost -{ - public Guid BreweryPostID { get; set; } - - public Guid PostedByID { get; set; } - - public string Description { get; set; } = null!; - - public DateTime CreatedAt { get; set; } - - public DateTime? UpdatedAt { get; set; } - - public virtual ICollection BeerPosts { get; set; } = new List(); - - public virtual ICollection BreweryPostPhotos { get; set; } = new List(); - - public virtual UserAccount PostedBy { get; set; } = null!; -} diff --git a/DataAccessLayer/BreweryPostPhoto.cs b/DataAccessLayer/BreweryPostPhoto.cs deleted file mode 100644 index 1191ae6..0000000 --- a/DataAccessLayer/BreweryPostPhoto.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class BreweryPostPhoto -{ - public Guid BreweryPostPhotoID { get; set; } - - public Guid BreweryPostID { get; set; } - - public Guid PhotoID { get; set; } - - public DateTime LinkedAt { get; set; } - - public virtual BreweryPost BreweryPost { get; set; } = null!; - - public virtual Photo Photo { get; set; } = null!; -} diff --git a/DataAccessLayer/Comment.cs b/DataAccessLayer/Comment.cs deleted file mode 100644 index 4eb0a84..0000000 --- a/DataAccessLayer/Comment.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class Comment -{ - public Guid CommentID { get; set; } - - public string? CommentText { get; set; } - - public Guid PostedByID { get; set; } - - public virtual UserAccount PostedBy { get; set; } = null!; -} diff --git a/DataAccessLayer/DataAccessLayer.csproj b/DataAccessLayer/DataAccessLayer.csproj deleted file mode 100644 index bb3f681..0000000 --- a/DataAccessLayer/DataAccessLayer.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - net8.0 - DataAccessLayer - enable - enable - - - - - - all - runtime; build; native; contentfiles; analyzers; buildtransitive - - - - diff --git a/DataAccessLayer/Photo.cs b/DataAccessLayer/Photo.cs deleted file mode 100644 index ba2b881..0000000 --- a/DataAccessLayer/Photo.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class Photo -{ - public Guid PhotoID { get; set; } - - public string? Hyperlink { get; set; } - - public Guid UploadedByID { get; set; } - - public DateTime UploadedAt { get; set; } - - public virtual ICollection BeerPostPhotos { get; set; } = new List(); - - public virtual ICollection BreweryPostPhotos { get; set; } = new List(); - - public virtual UserAccount UploadedBy { get; set; } = null!; - - public virtual ICollection UserAvatars { get; set; } = new List(); -} diff --git a/DataAccessLayer/UserAccount.cs b/DataAccessLayer/UserAccount.cs deleted file mode 100644 index a09ed2c..0000000 --- a/DataAccessLayer/UserAccount.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserAccount -{ - public Guid UserAccountID { get; set; } - - public string Username { get; set; } = null!; - - public string FirstName { get; set; } = null!; - - public string LastName { get; set; } = null!; - - public string Email { get; set; } = null!; - - public DateTime CreatedAt { get; set; } - - public DateTime? UpdatedAt { get; set; } - - public DateTime DateOfBirth { get; set; } - - public virtual ICollection BeerPosts { get; set; } = new List(); - - public virtual ICollection BreweryPosts { get; set; } = new List(); - - public virtual ICollection Comments { get; set; } = new List(); - - public virtual ICollection Photos { get; set; } = new List(); - - public virtual UserAvatar? UserAvatar { get; set; } - - public virtual UserCredential? UserCredential { get; set; } - - public virtual ICollection UserFollowFollowings { get; set; } = new List(); - - public virtual ICollection UserFollowUserAccounts { get; set; } = new List(); - - public virtual UserVerification? UserVerification { get; set; } -} diff --git a/DataAccessLayer/UserAvatar.cs b/DataAccessLayer/UserAvatar.cs deleted file mode 100644 index d9b9aba..0000000 --- a/DataAccessLayer/UserAvatar.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserAvatar -{ - public Guid UserAvatarID { get; set; } - - public Guid UserAccountID { get; set; } - - public Guid PhotoID { get; set; } - - public virtual Photo Photo { get; set; } = null!; - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/DataAccessLayer/UserCredential.cs b/DataAccessLayer/UserCredential.cs deleted file mode 100644 index 039861c..0000000 --- a/DataAccessLayer/UserCredential.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserCredential -{ - public Guid UserCredentialID { get; set; } - - public Guid UserAccountID { get; set; } - - public DateTime CreatedAt { get; set; } - - public DateTime Expiry { get; set; } - - public string Hash { get; set; } = null!; - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/DataAccessLayer/UserFollow.cs b/DataAccessLayer/UserFollow.cs deleted file mode 100644 index 975672f..0000000 --- a/DataAccessLayer/UserFollow.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserFollow -{ - public Guid UserFollowID { get; set; } - - public Guid UserAccountID { get; set; } - - public Guid FollowingID { get; set; } - - public DateTime CreatedAt { get; set; } - - public virtual UserAccount Following { get; set; } = null!; - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/DataAccessLayer/UserVerification.cs b/DataAccessLayer/UserVerification.cs deleted file mode 100644 index c4d7105..0000000 --- a/DataAccessLayer/UserVerification.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace DataAccessLayer; - -public partial class UserVerification -{ - public Guid UserVerificationID { get; set; } - - public Guid UserAccountID { get; set; } - - public DateTime VerificationDateTime { get; set; } - - public virtual UserAccount UserAccount { get; set; } = null!; -} diff --git a/biergarten.sln b/biergarten.sln index 869e9ba..6cb0770 100644 --- a/biergarten.sln +++ b/biergarten.sln @@ -7,6 +7,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccessLayer", "DataAcce EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "DataAccessLayer-Tests", "DataAccessLayer-Tests\DataAccessLayer-Tests.csproj", "{3638DC4E-D4C8-4DBE-CF3B-EF2C805509CE}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{8EC462FD-D22E-90A8-E5CE-7E832BA40C5D}" + ProjectSection(SolutionItems) = preProject + schema.sql = schema.sql + test-data.sql = test-data.sql + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/schema.sql b/schema.sql index eab8f62..64a35fc 100644 --- a/schema.sql +++ b/schema.sql @@ -41,6 +41,8 @@ CREATE TABLE UserAccount DateOfBirth DATETIME NOT NULL, + Timer ROWVERSION, + CONSTRAINT PK_UserAccount PRIMARY KEY (UserAccountID), @@ -51,27 +53,6 @@ CREATE TABLE UserAccount UNIQUE (Email), ); ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- -CREATE TABLE Comment -( - CommentID UNIQUEIDENTIFIER - CONSTRAINT DF_CommentID DEFAULT NEWID(), - - CommentText NVARCHAR(512), - - PostedByID UNIQUEIDENTIFIER NOT NULL, - - CONSTRAINT PK_CommentID - PRIMARY KEY (CommentID), - - CONSTRAINT FK_PostedByID - FOREIGN KEY (PostedByID) REFERENCES UserAccount(UserAccountID), -) - -CREATE NONCLUSTERED INDEX IX_Comment_PostedByID -ON Comment(PostedByID); - ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- @@ -88,6 +69,8 @@ CREATE TABLE Photo -- All photos must be linked to a user account, you cannot de UploadedAt DATETIME NOT NULL CONSTRAINT DF_Photo_UploadedAt DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_Photo PRIMARY KEY (PhotoID), @@ -112,6 +95,8 @@ CREATE TABLE UserAvatar -- delete avatar photo when user account is deleted PhotoID UNIQUEIDENTIFIER NOT NULL, + Timer ROWVERSION, + CONSTRAINT PK_UserAvatar PRIMARY KEY (UserAvatarID), CONSTRAINT FK_UserAvatar_UserAccount @@ -144,6 +129,8 @@ CREATE TABLE UserVerification -- delete verification data when user account is d CONSTRAINT DF_VerificationDateTime DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_UserVerification PRIMARY KEY (UserVerificationID), @@ -178,6 +165,8 @@ CREATE TABLE UserCredential -- delete credentials when user account is deleted Hash NVARCHAR(100) NOT NULL, -- uses argon2 + Timer ROWVERSION, + CONSTRAINT PK_UserCredential PRIMARY KEY (UserCredentialID), @@ -208,6 +197,8 @@ CREATE TABLE UserFollow CreatedAt DATETIME CONSTRAINT DF_UserFollow_CreatedAt DEFAULT GETDATE() NOT NULL, + Timer ROWVERSION, + CONSTRAINT PK_UserFollow PRIMARY KEY (UserFollowID), @@ -229,6 +220,67 @@ CREATE NONCLUSTERED INDEX IX_UserFollow_UserAccount_FollowingID CREATE NONCLUSTERED INDEX IX_UserFollow_FollowingID_UserAccount ON UserFollow(FollowingID, UserAccountID); + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- + +CREATE TABLE Country +( + CountryID UNIQUEIDENTIFIER + CONSTRAINT DF_CountryID DEFAULT NEWID(), + + CountryName NVARCHAR(100) NOT NULL, + + CountryCode CHAR(3) NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_Country + PRIMARY KEY (CountryID), +); + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- + +CREATE TABLE StateProvince +( + StateProvinceID UNIQUEIDENTIFIER + CONSTRAINT DF_StateProvinceID DEFAULT NEWID(), + + StateProvinceName NVARCHAR(100) NOT NULL, + + CountryID UNIQUEIDENTIFIER NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_StateProvince + PRIMARY KEY (StateProvinceID), + + CONSTRAINT FK_StateProvince_Country + FOREIGN KEY (CountryID) + REFERENCES Country(CountryID) +); + + +---------------------------------------------------------------------------- +---------------------------------------------------------------------------- + +CREATE TABLE City +( + CityID UNIQUEIDENTIFIER + CONSTRAINT DF_CityID DEFAULT NEWID(), + + CityName NVARCHAR(100) NOT NULL, + + StateProvinceID UNIQUEIDENTIFIER NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_City + PRIMARY KEY (CityID), +); + + ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- @@ -246,6 +298,12 @@ CREATE TABLE BreweryPost -- A user cannot be deleted if they have a post UpdatedAt DATETIME NULL, + Timer ROWVERSION, + + CityID UNIQUEIDENTIFIER NOT NULL, + + Coordinates GEOGRAPHY NOT NULL, + CONSTRAINT PK_BreweryPost PRIMARY KEY (BreweryPostID), @@ -258,9 +316,9 @@ CREATE TABLE BreweryPost -- A user cannot be deleted if they have a post CREATE NONCLUSTERED INDEX IX_BreweryPost_PostedByID ON BreweryPost(PostedByID); ----------------------------------------------------------------------------- ----------------------------------------------------------------------------- +--------------------------------------------------------------------------- +---------------------------------------------------------------------------- CREATE TABLE BreweryPostPhoto -- All photos linked to a post are deleted if the post is deleted ( BreweryPostPhotoID UNIQUEIDENTIFIER @@ -273,6 +331,8 @@ CREATE TABLE BreweryPostPhoto -- All photos linked to a post are deleted if the LinkedAt DATETIME NOT NULL CONSTRAINT DF_BreweryPostPhoto_LinkedAt DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_BreweryPostPhoto PRIMARY KEY (BreweryPostPhotoID), @@ -304,6 +364,8 @@ CREATE TABLE BeerStyle Description NVARCHAR(MAX), + Timer ROWVERSION, + CONSTRAINT PK_BeerStyle PRIMARY KEY (BeerStyleID), @@ -340,6 +402,8 @@ CREATE TABLE BeerPost UpdatedAt DATETIME, + Timer ROWVERSION, + CONSTRAINT PK_BeerPost PRIMARY KEY (BeerPostID), @@ -386,6 +450,8 @@ CREATE TABLE BeerPostPhoto -- All photos linked to a beer post are deleted if th LinkedAt DATETIME NOT NULL CONSTRAINT DF_BeerPostPhoto_LinkedAt DEFAULT GETDATE(), + Timer ROWVERSION, + CONSTRAINT PK_BeerPostPhoto PRIMARY KEY (BeerPostPhotoID), @@ -409,10 +475,36 @@ ON BeerPostPhoto(BeerPostID, PhotoID); ---------------------------------------------------------------------------- ---------------------------------------------------------------------------- +CREATE TABLE BeerPostComment +( + BeerPostCommentID UNIQUEIDENTIFIER + CONSTRAINT DF_BeerPostComment DEFAULT NEWID(), + + Comment NVARCHAR(250) NOT NULL, + + BeerPostID UNIQUEIDENTIFIER NOT NULL, + + Rating INT NOT NULL, + + Timer ROWVERSION, + + CONSTRAINT PK_BeerPostComment + PRIMARY KEY (BeerPostCommentID), + + CONSTRAINT FK_BeerPostComment_BeerPost + FOREIGN KEY (BeerPostID) REFERENCES BeerPost(BeerPostID) +) + +CREATE NONCLUSTERED INDEX IX_BeerPostComment_BeerPost + ON BeerPostComment(BeerPostID) + +----------------------------------------------------------------------------- +----------------------------------------------------------------------------- + /* -Install-Package Microsoft.EntityFrameworkCore.SqlServer -Install-Package Microsoft.EntityFrameworkCore.Tools +dotnet add package Microsoft.EntityFrameworkCore.SqlServer +dotnet add package Microsoft.EntityFrameworkCore.Tools -Scaffold-DbContext "Server=(localdb)\ProjectModels;Database=Biergarten;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -Context BiergartenContext -UseDatabaseNames -Force +Scaffold-DbContext "Data Source=AARONPC\INFO5052;Integrated Security=True;Persist Security Info=False;Pooling=False;MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=True;Database=Biergarten" Microsoft.EntityFrameworkCore.SqlServer -Context BiergartenContext -ContextDir "." -OutputDir "Entities" -UseDatabaseNames -Force */ diff --git a/test-data.sql b/test-data.sql index 1942bde..bbaa1ea 100644 --- a/test-data.sql +++ b/test-data.sql @@ -1,7 +1,6 @@ USE Biergarten; --- User Account Variables (30 users) DECLARE @user1 UNIQUEIDENTIFIER = NEWID(), @user2 UNIQUEIDENTIFIER = NEWID(), @@ -34,7 +33,6 @@ DECLARE @user29 UNIQUEIDENTIFIER = NEWID(), @user30 UNIQUEIDENTIFIER = NEWID(), --- BeerStyle Variables (13 styles) @ipa UNIQUEIDENTIFIER = NEWID(), @stout UNIQUEIDENTIFIER = NEWID(), @lager UNIQUEIDENTIFIER = NEWID(), @@ -49,7 +47,6 @@ DECLARE @brown UNIQUEIDENTIFIER = NEWID(), @barleywine UNIQUEIDENTIFIER = NEWID(), --- Photo Variables (40 photos) @photo1 UNIQUEIDENTIFIER = NEWID(), @photo2 UNIQUEIDENTIFIER = NEWID(), @photo3 UNIQUEIDENTIFIER = NEWID(), @@ -91,7 +88,6 @@ DECLARE @photo39 UNIQUEIDENTIFIER = NEWID(), @photo40 UNIQUEIDENTIFIER = NEWID(), --- BreweryPost Variables (15 breweries) @brewery1 UNIQUEIDENTIFIER = NEWID(), @brewery2 UNIQUEIDENTIFIER = NEWID(), @brewery3 UNIQUEIDENTIFIER = NEWID(), @@ -108,7 +104,6 @@ DECLARE @brewery14 UNIQUEIDENTIFIER = NEWID(), @brewery15 UNIQUEIDENTIFIER = NEWID(), --- BeerPost Variables (28 beers) @beer1 UNIQUEIDENTIFIER = NEWID(), @beer2 UNIQUEIDENTIFIER = NEWID(), @beer3 UNIQUEIDENTIFIER = NEWID(), @@ -138,57 +133,39 @@ DECLARE @beer27 UNIQUEIDENTIFIER = NEWID(), @beer28 UNIQUEIDENTIFIER = NEWID(), --- Rating Variables (50 ratings) -@rating1 UNIQUEIDENTIFIER = NEWID(), -@rating2 UNIQUEIDENTIFIER = NEWID(), -@rating3 UNIQUEIDENTIFIER = NEWID(), -@rating4 UNIQUEIDENTIFIER = NEWID(), -@rating5 UNIQUEIDENTIFIER = NEWID(), -@rating6 UNIQUEIDENTIFIER = NEWID(), -@rating7 UNIQUEIDENTIFIER = NEWID(), -@rating8 UNIQUEIDENTIFIER = NEWID(), -@rating9 UNIQUEIDENTIFIER = NEWID(), -@rating10 UNIQUEIDENTIFIER = NEWID(), -@rating11 UNIQUEIDENTIFIER = NEWID(), -@rating12 UNIQUEIDENTIFIER = NEWID(), -@rating13 UNIQUEIDENTIFIER = NEWID(), -@rating14 UNIQUEIDENTIFIER = NEWID(), -@rating15 UNIQUEIDENTIFIER = NEWID(), -@rating16 UNIQUEIDENTIFIER = NEWID(), -@rating17 UNIQUEIDENTIFIER = NEWID(), -@rating18 UNIQUEIDENTIFIER = NEWID(), -@rating19 UNIQUEIDENTIFIER = NEWID(), -@rating20 UNIQUEIDENTIFIER = NEWID(), -@rating21 UNIQUEIDENTIFIER = NEWID(), -@rating22 UNIQUEIDENTIFIER = NEWID(), -@rating23 UNIQUEIDENTIFIER = NEWID(), -@rating24 UNIQUEIDENTIFIER = NEWID(), -@rating25 UNIQUEIDENTIFIER = NEWID(), -@rating26 UNIQUEIDENTIFIER = NEWID(), -@rating27 UNIQUEIDENTIFIER = NEWID(), -@rating28 UNIQUEIDENTIFIER = NEWID(), -@rating29 UNIQUEIDENTIFIER = NEWID(), -@rating30 UNIQUEIDENTIFIER = NEWID(), -@rating31 UNIQUEIDENTIFIER = NEWID(), -@rating32 UNIQUEIDENTIFIER = NEWID(), -@rating33 UNIQUEIDENTIFIER = NEWID(), -@rating34 UNIQUEIDENTIFIER = NEWID(), -@rating35 UNIQUEIDENTIFIER = NEWID(), -@rating36 UNIQUEIDENTIFIER = NEWID(), -@rating37 UNIQUEIDENTIFIER = NEWID(), -@rating38 UNIQUEIDENTIFIER = NEWID(), -@rating39 UNIQUEIDENTIFIER = NEWID(), -@rating40 UNIQUEIDENTIFIER = NEWID(), -@rating41 UNIQUEIDENTIFIER = NEWID(), -@rating42 UNIQUEIDENTIFIER = NEWID(), -@rating43 UNIQUEIDENTIFIER = NEWID(), -@rating44 UNIQUEIDENTIFIER = NEWID(), -@rating45 UNIQUEIDENTIFIER = NEWID(), -@rating46 UNIQUEIDENTIFIER = NEWID(), -@rating47 UNIQUEIDENTIFIER = NEWID(), -@rating48 UNIQUEIDENTIFIER = NEWID(), -@rating49 UNIQUEIDENTIFIER = NEWID(), -@rating50 UNIQUEIDENTIFIER = NEWID(); +@countryUSA UNIQUEIDENTIFIER = NEWID(), + +@stateOregon UNIQUEIDENTIFIER = NEWID(), +@stateMichigan UNIQUEIDENTIFIER = NEWID(), +@stateCalifornia UNIQUEIDENTIFIER = NEWID(), +@stateColorado UNIQUEIDENTIFIER = NEWID(), +@stateWashington UNIQUEIDENTIFIER = NEWID(), +@stateIllinois UNIQUEIDENTIFIER = NEWID(), +@stateNewYork UNIQUEIDENTIFIER = NEWID(), +@stateTexas UNIQUEIDENTIFIER = NEWID(), +@stateMassachusetts UNIQUEIDENTIFIER = NEWID(), +@statePennsylvania UNIQUEIDENTIFIER = NEWID(), +@stateNorthCarolina UNIQUEIDENTIFIER = NEWID(), +@stateGeorgia UNIQUEIDENTIFIER = NEWID(), +@stateOhio UNIQUEIDENTIFIER = NEWID(), +@stateMissouri UNIQUEIDENTIFIER = NEWID(), +@stateVirginia UNIQUEIDENTIFIER = NEWID(), + +@cityPortland UNIQUEIDENTIFIER = NEWID(), +@cityGrandRapids UNIQUEIDENTIFIER = NEWID(), +@citySanFrancisco UNIQUEIDENTIFIER = NEWID(), +@cityDenver UNIQUEIDENTIFIER = NEWID(), +@citySeattle UNIQUEIDENTIFIER = NEWID(), +@cityChicago UNIQUEIDENTIFIER = NEWID(), +@cityBrooklyn UNIQUEIDENTIFIER = NEWID(), +@cityAustin UNIQUEIDENTIFIER = NEWID(), +@cityBoston UNIQUEIDENTIFIER = NEWID(), +@cityPhiladelphia UNIQUEIDENTIFIER = NEWID(), +@cityAsheville UNIQUEIDENTIFIER = NEWID(), +@cityAtlanta UNIQUEIDENTIFIER = NEWID(), +@cityColumbus UNIQUEIDENTIFIER = NEWID(), +@cityKansasCity UNIQUEIDENTIFIER = NEWID(), +@cityRichmond UNIQUEIDENTIFIER = NEWID(); ---------------------------------------------------------------------------- -- UserAccount (30 users) @@ -252,7 +229,6 @@ VALUES (@barleywine, 'Barleywine', 'Strong ale with intense malt flavors and high alcohol content.'); COMMIT TRANSACTION; - ---------------------------------------------------------------------------- -- UserCredential (28 credentials) ---------------------------------------------------------------------------- @@ -439,28 +415,88 @@ VALUES COMMIT TRANSACTION; +-- Country (1 country) +---------------------------------------------------------------------------- +BEGIN TRANSACTION; +INSERT INTO dbo.Country + (CountryID, CountryName, CountryCode) +VALUES + (@countryUSA, 'United States', 'USA'); +COMMIT TRANSACTION; + + +---------------------------------------------------------------------------- +-- StateProvince (15 states/provinces) +---------------------------------------------------------------------------- +BEGIN TRANSACTION; +INSERT INTO dbo.StateProvince + (StateProvinceID, StateProvinceName, CountryID) +VALUES + (@stateOregon, 'Oregon', @countryUSA), + (@stateMichigan, 'Michigan', @countryUSA), + (@stateCalifornia, 'California', @countryUSA), + (@stateColorado, 'Colorado', @countryUSA), + (@stateWashington, 'Washington', @countryUSA), + (@stateIllinois, 'Illinois', @countryUSA), + (@stateNewYork, 'New York', @countryUSA), + (@stateTexas, 'Texas', @countryUSA), + (@stateMassachusetts, 'Massachusetts', @countryUSA), + (@statePennsylvania, 'Pennsylvania', @countryUSA), + (@stateNorthCarolina, 'North Carolina', @countryUSA), + (@stateGeorgia, 'Georgia', @countryUSA), + (@stateOhio, 'Ohio', @countryUSA), + (@stateMissouri, 'Missouri', @countryUSA), + (@stateVirginia, 'Virginia', @countryUSA); +COMMIT TRANSACTION; + + +---------------------------------------------------------------------------- +-- City (15 cities) +---------------------------------------------------------------------------- +BEGIN TRANSACTION; +INSERT INTO dbo.City + (CityID, CityName, StateProvinceID) +VALUES + (@cityPortland, 'Portland', @stateOregon), + (@cityGrandRapids, 'Grand Rapids', @stateMichigan), + (@citySanFrancisco, 'San Francisco', @stateCalifornia), + (@cityDenver, 'Denver', @stateColorado), + (@citySeattle, 'Seattle', @stateWashington), + (@cityChicago, 'Chicago', @stateIllinois), + (@cityBrooklyn, 'Brooklyn', @stateNewYork), + (@cityAustin, 'Austin', @stateTexas), + (@cityBoston, 'Boston', @stateMassachusetts), + (@cityPhiladelphia, 'Philadelphia', @statePennsylvania), + (@cityAsheville, 'Asheville', @stateNorthCarolina), + (@cityAtlanta, 'Atlanta', @stateGeorgia), + (@cityColumbus, 'Columbus', @stateOhio), + (@cityKansasCity, 'Kansas City', @stateMissouri), + (@cityRichmond, 'Richmond', @stateVirginia); +COMMIT TRANSACTION; + + ---------------------------------------------------------------------------- -- BreweryPost (15 breweries) ---------------------------------------------------------------------------- BEGIN TRANSACTION; INSERT INTO dbo.BreweryPost - (BreweryPostID, PostedByID, Description, CreatedAt) + (BreweryPostID, PostedByID, Description, CreatedAt, UpdatedAt, CityID, Coordinates) VALUES - (@brewery1, @user1, 'Hoppy Trails Brewery - Crafting exceptional IPAs since 2020. Located in the heart of Portland.', '2023-02-01'), - (@brewery2, @user2, 'Dark Horse Brewing Co. - Specializing in rich stouts and porters. Family owned and operated.', '2023-03-01'), - (@brewery3, @user3, 'Golden Gate Lager House - Traditional German-style lagers brewed with precision.', '2023-04-01'), - (@brewery4, @user5, 'Mountain View Ales - High-altitude brewing for unique flavor profiles.', '2023-05-15'), - (@brewery5, @user6, 'Coastal Wheat Works - Refreshing wheat beers perfect for any season.', '2023-06-20'), - (@brewery6, @user9, 'Riverside Porter Factory - Classic porters with a modern twist.', '2023-08-10'), - (@brewery7, @user11, 'Sunset Sour Cellars - Experimental sour ales aged in oak barrels.', '2024-01-20'), - (@brewery8, @user14, 'Urban Craft Collective - Community-focused brewery with rotating seasonal offerings.', '2024-05-10'), - (@brewery9, @user4, 'Belgian House - Authentic Belgian brewing traditions in the heart of the city.', '2024-06-01'), - (@brewery10, @user18, 'Amber Fields Brewery - Celebrating the richness of amber ales and maltier styles.', '2024-08-15'), - (@brewery11, @user20, 'Farmhouse Funk - Specializing in saisons and wild fermented ales.', '2024-09-20'), - (@brewery12, @user24, 'Brown Bear Brewing - Cozy taproom featuring award-winning brown ales.', '2025-01-10'), - (@brewery13, @user27, 'Vintage Vats - Small-batch barleywines and aged strong ales.', '2025-02-25'), - (@brewery14, @user12, 'Hop Haven - Experimental IPAs and cutting-edge hop varieties.', '2024-10-05'), - (@brewery15, @user8, 'Barrel & Grain - Farm-to-glass brewery using locally sourced ingredients.', '2024-04-20'); + (@brewery1, @user1, 'Hoppy Trails Brewery - Crafting exceptional IPAs since 2020. Located in the heart of Portland.', '2023-02-01', NULL, @cityPortland, GEOGRAPHY::Point(45.5152, -122.6784, 4326)), + (@brewery2, @user2, 'Dark Horse Brewing Co. - Specializing in rich stouts and porters. Family owned and operated.', '2023-03-01', NULL, @cityGrandRapids, GEOGRAPHY::Point(42.9634, -85.6681, 4326)), + (@brewery3, @user3, 'Golden Gate Lager House - Traditional German-style lagers brewed with precision.', '2023-04-01', NULL, @citySanFrancisco, GEOGRAPHY::Point(37.7749, -122.4194, 4326)), + (@brewery4, @user5, 'Mountain View Ales - High-altitude brewing for unique flavor profiles.', '2023-05-15', NULL, @cityDenver, GEOGRAPHY::Point(39.7392, -104.9903, 4326)), + (@brewery5, @user6, 'Coastal Wheat Works - Refreshing wheat beers perfect for any season.', '2023-06-20', NULL, @citySeattle, GEOGRAPHY::Point(47.6062, -122.3321, 4326)), + (@brewery6, @user9, 'Riverside Porter Factory - Classic porters with a modern twist.', '2023-08-10', NULL, @cityChicago, GEOGRAPHY::Point(41.8781, -87.6298, 4326)), + (@brewery7, @user11, 'Sunset Sour Cellars - Experimental sour ales aged in oak barrels.', '2024-01-20', '2024-08-12', @cityBrooklyn, GEOGRAPHY::Point(40.6782, -73.9442, 4326)), + (@brewery8, @user14, 'Urban Craft Collective - Community-focused brewery with rotating seasonal offerings.', '2024-05-10', NULL, @cityAustin, GEOGRAPHY::Point(30.2672, -97.7431, 4326)), + (@brewery9, @user4, 'Belgian House - Authentic Belgian brewing traditions in the heart of the city.', '2024-06-01', NULL, @cityBoston, GEOGRAPHY::Point(42.3601, -71.0589, 4326)), + (@brewery10, @user18, 'Amber Fields Brewery - Celebrating the richness of amber ales and maltier styles.', '2024-08-15', NULL, @cityPhiladelphia, GEOGRAPHY::Point(39.9526, -75.1652, 4326)), + (@brewery11, @user20, 'Farmhouse Funk - Specializing in saisons and wild fermented ales.', '2024-09-20', NULL, @cityAsheville, GEOGRAPHY::Point(35.5951, -82.5515, 4326)), + (@brewery12, @user24, 'Brown Bear Brewing - Cozy taproom featuring award-winning brown ales.', '2025-01-10', NULL, @cityAtlanta, GEOGRAPHY::Point(33.7490, -84.3880, 4326)), + (@brewery13, @user27, 'Vintage Vats - Small-batch barleywines and aged strong ales.', '2025-02-25', NULL, @cityColumbus, GEOGRAPHY::Point(39.9612, -82.9988, 4326)), + (@brewery14, @user12, 'Hop Haven - Experimental IPAs and cutting-edge hop varieties.', '2024-10-05', NULL, @cityKansasCity, GEOGRAPHY::Point(39.0997, -94.5786, 4326)), + (@brewery15, @user8, 'Barrel & Grain - Farm-to-glass brewery using locally sourced ingredients.', '2024-04-20', NULL, @cityRichmond, GEOGRAPHY::Point(37.5407, -77.4360, 4326)); COMMIT TRANSACTION; @@ -553,134 +589,6 @@ VALUES COMMIT TRANSACTION; ----------------------------------------------------------------------------- --- Rating (50 ratings) ----------------------------------------------------------------------------- -BEGIN TRANSACTION; -INSERT INTO dbo.Rating - (RatingID, Score, RatedByID) -VALUES - (@rating1, 5, @user2), - (@rating2, 4, @user3), - (@rating3, 5, @user4), - (@rating4, 3, @user5), - (@rating5, 4, @user6), - (@rating6, 5, @user7), - (@rating7, 4, @user8), - (@rating8, 5, @user9), - (@rating9, 3, @user10), - (@rating10, 4, @user11), - (@rating11, 5, @user12), - (@rating12, 4, @user13), - (@rating13, 5, @user14), - (@rating14, 3, @user15), - (@rating15, 4, @user16), - (@rating16, 5, @user17), - (@rating17, 4, @user18), - (@rating18, 5, @user19), - (@rating19, 3, @user20), - (@rating20, 4, @user21), - (@rating21, 5, @user22), - (@rating22, 4, @user23), - (@rating23, 5, @user24), - (@rating24, 3, @user25), - (@rating25, 4, @user26), - (@rating26, 5, @user27), - (@rating27, 4, @user28), - (@rating28, 5, @user29), - (@rating29, 3, @user30), - (@rating30, 4, @user1), - (@rating31, 5, @user3), - (@rating32, 4, @user4), - (@rating33, 5, @user6), - (@rating34, 3, @user8), - (@rating35, 4, @user9), - (@rating36, 5, @user10), - (@rating37, 4, @user11), - (@rating38, 5, @user13), - (@rating39, 3, @user14), - (@rating40, 4, @user15), - (@rating41, 5, @user16), - (@rating42, 4, @user17), - (@rating43, 5, @user18), - (@rating44, 3, @user19), - (@rating45, 4, @user20), - (@rating46, 5, @user21), - (@rating47, 4, @user22), - (@rating48, 5, @user23), - (@rating49, 3, @user24), - (@rating50, 4, @user25); -COMMIT TRANSACTION; - - ----------------------------------------------------------------------------- --- BeerPostComment (30 beer comments) ----------------------------------------------------------------------------- -BEGIN TRANSACTION; -INSERT INTO dbo.BeerPostComment - (CommentText, PostedByID, RatingID) -VALUES - ('This IPA is absolutely fantastic! Perfect balance of hops and malt.', @user2, @rating1), - ('Love the citrus notes in this beer. Will definitely buy again!', @user3, @rating2), - ('Rich and smooth stout. The chocolate flavor is amazing.', @user4, @rating3), - ('Good lager, very refreshing on a hot day.', @user5, @rating4), - ('Nice pale ale, but could use a bit more hop character.', @user6, @rating5), - ('Best wheat beer I''ve had in a while!', @user7, @rating6), - ('Solid porter with great roasted malt flavor.', @user8, @rating7), - ('This sour ale is perfectly tart and refreshing.', @user9, @rating8), - ('Decent pilsner, nothing special but drinkable.', @user10, @rating9), - ('The double IPA lives up to its name - super hoppy!', @user11, @rating10), - ('Vanilla porter is a unique and delicious combination.', @user12, @rating11), - ('Classic hefeweizen with authentic Bavarian character.', @user13, @rating12), - ('Belgian Bliss is truly blissful! Amazing complexity.', @user22, @rating21), - ('Copper Crown has the perfect amber color and taste.', @user23, @rating22), - ('This saison is incredibly refreshing and unique.', @user24, @rating23), - ('Barleywine is a bit too strong for my taste.', @user25, @rating24), - ('Love the citrus bomb! Perfect for IPA lovers.', @user26, @rating25), - ('Mosaic Dream lives up to its name - dreamy!', @user27, @rating26), - ('Farm fresh lager is exactly that - fresh and clean.', @user28, @rating27), - ('Midnight Express gives me the perfect coffee kick.', @user29, @rating28), - ('Harvest wheat is okay, but I prefer traditional wheats.', @user30, @rating29), - ('Cherry sunset sour is perfectly balanced.', @user1, @rating30), - ('Pacific Pale Ale brings back West Coast memories.', @user3, @rating31), - ('Bohemian Pilsner is as authentic as it gets.', @user4, @rating32), - ('Coffee porter is my new favorite breakfast beer!', @user6, @rating33), - ('Wild ferment is interesting but not for everyone.', @user8, @rating34), - ('Session IPA is perfect for summer afternoons.', @user9, @rating35), - ('Nutty brown ale has incredible depth of flavor.', @user10, @rating36), - ('Old Guardian is a masterpiece of brewing.', @user11, @rating37), - ('Imperial Stout deserves all the awards.', @user13, @rating38); -COMMIT TRANSACTION; - - ----------------------------------------------------------------------------- --- BreweryPostComment (20 brewery comments) ----------------------------------------------------------------------------- -BEGIN TRANSACTION; -INSERT INTO dbo.BreweryPostComment - (CommentText, PostedByID, RatingID) -VALUES - ('Amazing brewery! The taproom has a great atmosphere.', @user14, @rating13), - ('Love supporting local breweries like this one.', @user15, @rating14), - ('Good selection of beers, but service could be better.', @user16, @rating15), - ('Best brewery in the area, hands down!', @user17, @rating16), - ('Nice facility and friendly staff. Will visit again.', @user18, @rating17), - ('Great variety of beer styles. Something for everyone.', @user19, @rating18), - ('Decent brewery but a bit pricey.', @user20, @rating19), - ('Fantastic sour beer selection! Worth the trip.', @user21, @rating20), - ('Belgian House has the most authentic Belgian beers outside Belgium!', @user14, @rating39), - ('Amber Fields creates consistently excellent amber ales.', @user15, @rating40), - ('Farmhouse Funk is a must-visit for sour beer enthusiasts.', @user16, @rating41), - ('Brown Bear Brewing has a cozy atmosphere and great beer.', @user17, @rating42), - ('Vintage Vats ages their beers to perfection.', @user18, @rating43), - ('Hop Haven is always pushing boundaries with new hops.', @user19, @rating44), - ('Barrel & Grain sources locally and it shows in quality.', @user20, @rating45), - ('Hoppy Trails never disappoints with their IPAs.', @user21, @rating46), - ('Dark Horse makes the best stouts in the region.', @user22, @rating47), - ('Golden Gate Lager House is my -to for crisp lagers.', @user23, @rating48), - ('Mountain View Ales has incredible views and incredible beer.', @user24, @rating49), - ('Coastal Wheat Works perfects the art of wheat beer.', @user25, @rating50); -COMMIT TRANSACTION; ----------------------------------------------------------------------------