diff --git a/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs b/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs
index 8d787a1b..de413739 100644
--- a/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs
+++ b/Snittlistan.Test/ApiControllers/Infrastructure/InMemoryContext.cs
@@ -1,4 +1,6 @@
-using System.Collections;
+#nullable enable
+
+using System.Collections;
using System.Collections.ObjectModel;
using System.Data.Entity;
using System.Data.Entity.Infrastructure;
@@ -6,9 +8,8 @@
using System.Reflection;
using Snittlistan.Web.Infrastructure.Database;
-#nullable enable
-
namespace Snittlistan.Test.ApiControllers.Infrastructure;
+
public sealed class InMemoryDbSet : IDbSet, IDbAsyncEnumerable where T : class
{
private readonly IdGenerator _generator;
@@ -106,19 +107,28 @@ public InMemoryContext()
IdGenerator generator = new();
PublishedTasks = new InMemoryDbSet(generator);
Tenants = new InMemoryDbSet(generator);
- Teams = new InMemoryDbSet(generator);
- Hallar = new InMemoryDbSet(generator);
+ Team = new InMemoryDbSet(generator);
+ Hall = new InMemoryDbSet(generator);
RosterMails = new InMemoryDbSet(generator);
ChangeLogs = new InMemoryDbSet(generator);
KeyValueProperties = new InMemoryDbSet(generator);
SentEmails = new InMemoryDbSet(generator);
+ Match = new InMemoryDbSet(generator);
+ TeamRef = new InMemoryDbSet(generator);
+ OilProfile = new InMemoryDbSet(generator);
}
public IDbSet PublishedTasks { get; }
- public IDbSet Teams { get; }
+ public IDbSet Team { get; }
+
+ public IDbSet Hall { get; }
+
+ public IDbSet Match { get; }
+
+ public IDbSet TeamRef { get; }
- public IDbSet Hallar { get; }
+ public IDbSet OilProfile { get; }
public IDbSet Tenants { get; }
@@ -130,7 +140,7 @@ public InMemoryContext()
public IDbSet SentEmails { get; }
- public DbChangeTracker ChangeTracker => throw new NotImplementedException();
+ public DbChangeTracker ChangeTracker { get; } = null!;
public int SaveChanges()
{
diff --git a/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs b/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs
index d75c560a..4b47e3f5 100644
--- a/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs
+++ b/Snittlistan.Web/Areas/V1/Controllers/SearchController.cs
@@ -16,7 +16,7 @@ public JsonResult TeamsQuickSearch(string term)
}
var query =
- from team in CompositionRoot.Databases.Bits.Teams
+ from team in CompositionRoot.Databases.Bits.Team
where team.TeamAlias.StartsWith(term)
orderby team.TeamAlias
select new
@@ -35,7 +35,7 @@ public JsonResult LocationsQuickSearch(string term)
}
var query =
- from hall in CompositionRoot.Databases.Bits.Hallar
+ from hall in CompositionRoot.Databases.Bits.Hall
where hall.HallName.StartsWith(term)
orderby hall.HallName
select new
diff --git a/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs b/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs
index 12882c6a..439c4d4b 100644
--- a/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs
+++ b/Snittlistan.Web/Areas/V2/Controllers/Api/TaskController.cs
@@ -19,6 +19,26 @@ namespace Snittlistan.Web.Areas.V2.Controllers.Api;
[OnlyLocalAllowed]
public class TaskController : AbstractApiController
{
+ public async Task Get()
+ {
+ var query =
+ from m in CompositionRoot.Databases.Bits.Match
+ where m.MatchId == 6422
+ select new
+ {
+ m.ExternalMatchId,
+ HomeTeamName = m.HomeTeamRef.TeamName,
+ AwayTeamName = m.AwayTeamRef.TeamName,
+ m.MatchDateTime,
+ m.HallRef.HallRefId,
+ HallRef_HallName = m.HallRef.HallName,
+ HallName = m.HallRef.Hall!.HallName ?? ""
+ };
+ var result = await query
+ .FirstOrDefaultAsync();
+ return Ok(result);
+ }
+
public async Task Post(TaskRequest request)
{
Logger.InfoFormat("Received task {taskJson}", request.TaskJson);
diff --git a/Snittlistan.Web/Infrastructure/Database/BitsContext.cs b/Snittlistan.Web/Infrastructure/Database/BitsContext.cs
index 1eea7dce..99f2a545 100644
--- a/Snittlistan.Web/Infrastructure/Database/BitsContext.cs
+++ b/Snittlistan.Web/Infrastructure/Database/BitsContext.cs
@@ -1,15 +1,26 @@
-using Npgsql.NameTranslation;
-using System.Data.Entity;
+#nullable enable
-#nullable enable
+using Npgsql.NameTranslation;
namespace Snittlistan.Web.Infrastructure.Database;
public class BitsContext : DbContext, IBitsContext
{
- public IDbSet Teams { get; set; } = null!;
+ public BitsContext()
+ {
+ Configuration.AutoDetectChangesEnabled = false;
+ Configuration.LazyLoadingEnabled = false;
+ }
+
+ public IDbSet Team { get; set; } = null!;
+
+ public IDbSet Hall { get; set; } = null!;
- public IDbSet Hallar { get; set; } = null!;
+ public IDbSet Match { get; set; } = null!;
+
+ public IDbSet TeamRef { get; set; } = null!;
+
+ public IDbSet OilProfile { get; set; } = null!;
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
@@ -17,7 +28,14 @@ protected override void OnModelCreating(DbModelBuilder modelBuilder)
System.Data.Entity.Database.SetInitializer(new NullDatabaseInitializer());
NpgsqlSnakeCaseNameTranslator mapper = new();
_ = modelBuilder.HasDefaultSchema("bits");
- modelBuilder.Properties().Configure(x => x.HasColumnName(mapper.TranslateMemberName(x.ClrPropertyInfo.Name)));
- modelBuilder.Types().Configure(x => x.ToTable(mapper.TranslateMemberName(x.ClrType.Name.Replace("Bits", string.Empty))));
+ modelBuilder.Properties().Configure(x => x.HasColumnName(
+ mapper.TranslateMemberName(x.ClrPropertyInfo.Name)));
+ modelBuilder.Types().Configure(x => x.ToTable(
+ mapper.TranslateMemberName(x.ClrType.Name.Replace("Bits_", string.Empty))));
+
+ _ = modelBuilder.Entity()
+ .HasOptional(x => x.Hall)
+ .WithOptionalDependent(x => x!.HallRef)
+ .Map(x => x.MapKey("hall_id"));
}
}
diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs b/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs
index d4a52e8c..f127f4d2 100644
--- a/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs
+++ b/Snittlistan.Web/Infrastructure/Database/Bits_Hall.cs
@@ -1,10 +1,19 @@
#nullable enable
+using System.ComponentModel.DataAnnotations;
+
namespace Snittlistan.Web.Infrastructure.Database;
public class Bits_Hall
{
- public int ExternalHallId { get; set; }
+ [Key]
+ public int HallId { get; private set; }
+
+ public int ExternalHallId { get; private set; }
+
+ public string HallName { get; private set; } = string.Empty;
+
+ public int HallRefId { get; set; }
- public string HallName { get; set; } = null!;
+ public Bits_HallRef HallRef { get; private set; } = null!;
}
diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_HallRef.cs b/Snittlistan.Web/Infrastructure/Database/Bits_HallRef.cs
new file mode 100644
index 00000000..791bea5d
--- /dev/null
+++ b/Snittlistan.Web/Infrastructure/Database/Bits_HallRef.cs
@@ -0,0 +1,21 @@
+#nullable enable
+
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Snittlistan.Web.Infrastructure.Database;
+
+public class Bits_HallRef
+{
+ [Key]
+ public int HallRefId { get; private set; }
+
+ public int ExternalHallId { get; private set; }
+
+ //[ForeignKey(nameof(Hall))]
+ //public int HallId { get; private set; }
+
+ public string HallName { get; private set; } = string.Empty;
+
+ public Bits_Hall? Hall { get; private set; }
+}
diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_Match.cs b/Snittlistan.Web/Infrastructure/Database/Bits_Match.cs
new file mode 100644
index 00000000..912ea668
--- /dev/null
+++ b/Snittlistan.Web/Infrastructure/Database/Bits_Match.cs
@@ -0,0 +1,59 @@
+#nullable enable
+
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Snittlistan.Web.Infrastructure.Database;
+
+/*
+ * SELECT
+ m.external_match_id,
+ tr_home.team_name AS home_team_name,
+ tr_home.team_alias AS home_team_alias,
+ tr_away.team_name AS away_team_name,
+ tr_away.team_alias AS away_team_alias,
+ op.oil_profile_name,
+ hr.hall_name
+FROM
+ bits.match m
+ JOIN bits.team_ref tr_home ON m.match_home_team_ref_id = tr_home.team_ref_id
+ JOIN bits.team_ref tr_away ON m.match_away_team_ref_id = tr_away.team_ref_id
+ JOIN bits.oil_profile op ON m.match_oil_profile_id = op.oil_profile_id
+ JOIN bits.hall_ref hr ON m.match_hall_ref_id = hr.hall_ref_id
+WHERE
+ m.external_match_id = 3235829;
+
+ */
+public class Bits_Match
+{
+ [Key]
+ public int MatchId { get; private set; }
+
+ public int ExternalMatchId { get; private set; }
+
+ public DateTime MatchDateTime { get; private set; }
+
+ [Column("match_home_team_ref_id")]
+ [ForeignKey(nameof(HomeTeamRef))]
+ public int HomeTeamRefId { get; private set; }
+
+ public virtual Bits_TeamRef HomeTeamRef { get; private set; } = null!;
+
+ [Column("match_away_team_ref_id")]
+ [ForeignKey(nameof(AwayTeamRef))]
+ public int AwayTeamRefId { get; private set; }
+
+ public virtual Bits_TeamRef AwayTeamRef { get; private set; } = null!;
+
+ [Column("match_oil_profile_id")]
+ [ForeignKey(nameof(OilProfile))]
+ public int OilProfileId { get; private set; }
+
+ public virtual Bits_OilProfile OilProfile { get; private set; } = null!;
+
+ [Column("match_hall_ref_id")]
+ [ForeignKey(nameof(HallRef))]
+ public int HallRefId { get; private set; }
+
+ public Bits_HallRef HallRef { get; private set; } = null!;
+}
diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_OilProfile.cs b/Snittlistan.Web/Infrastructure/Database/Bits_OilProfile.cs
new file mode 100644
index 00000000..e534b3c1
--- /dev/null
+++ b/Snittlistan.Web/Infrastructure/Database/Bits_OilProfile.cs
@@ -0,0 +1,16 @@
+#nullable enable
+
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Snittlistan.Web.Infrastructure.Database;
+
+public class Bits_OilProfile
+{
+ [Key]
+ public int OilProfileId { get; set; }
+
+ [InverseProperty(nameof(Bits_Match.OilProfile))]
+ public virtual ICollection Matches { get; set; } =
+ new HashSet();
+}
diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs b/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs
index 9a38ce71..7f2e978d 100644
--- a/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs
+++ b/Snittlistan.Web/Infrastructure/Database/Bits_Team.cs
@@ -1,9 +1,14 @@
#nullable enable
+using System.ComponentModel.DataAnnotations;
+
namespace Snittlistan.Web.Infrastructure.Database;
public class Bits_Team
{
+ [Key]
+ public int TeamId { get; set; }
+
public int ExternalTeamId { get; set; }
public string TeamName { get; set; } = null!;
diff --git a/Snittlistan.Web/Infrastructure/Database/Bits_TeamRef.cs b/Snittlistan.Web/Infrastructure/Database/Bits_TeamRef.cs
new file mode 100644
index 00000000..c87011f1
--- /dev/null
+++ b/Snittlistan.Web/Infrastructure/Database/Bits_TeamRef.cs
@@ -0,0 +1,26 @@
+#nullable enable
+
+using System.ComponentModel.DataAnnotations;
+using System.ComponentModel.DataAnnotations.Schema;
+
+namespace Snittlistan.Web.Infrastructure.Database;
+
+public class Bits_TeamRef
+{
+ [Key]
+ public int TeamRefId { get; private set; }
+
+ public int ExternalTeamId { get; set; }
+
+ public string TeamName { get; private set; } = string.Empty;
+
+ public string TeamAlias { get; set; } = string.Empty;
+
+ [InverseProperty(nameof(Bits_Match.HomeTeamRef))]
+ public virtual ICollection HomeMatches { get; private set; } =
+ new HashSet();
+
+ [InverseProperty(nameof(Bits_Match.AwayTeamRef))]
+ public virtual ICollection AwayMatches { get; private set; } =
+ new HashSet();
+}
diff --git a/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs b/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs
index 6f2e820a..f96b22e1 100644
--- a/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs
+++ b/Snittlistan.Web/Infrastructure/Database/IBitsContext.cs
@@ -1,12 +1,16 @@
-
-using System.Data.Entity;
-
-#nullable enable
+#nullable enable
namespace Snittlistan.Web.Infrastructure.Database;
+
public interface IBitsContext
{
- public IDbSet Teams { get; }
+ public IDbSet Team { get; }
+
+ public IDbSet Hall { get; }
+
+ public IDbSet Match { get; }
+
+ public IDbSet TeamRef { get; }
- public IDbSet Hallar { get; }
+ public IDbSet OilProfile { get; }
}
diff --git a/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs b/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs
index 6dbec398..ce3e56d2 100644
--- a/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs
+++ b/Snittlistan.Web/Infrastructure/Database/ISnittlistanContext.cs
@@ -1,6 +1,5 @@
#nullable enable
-using System.Data.Entity;
using System.Data.Entity.Infrastructure;
namespace Snittlistan.Web.Infrastructure.Database;
diff --git a/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs b/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs
index 0c693043..494499f8 100644
--- a/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs
+++ b/Snittlistan.Web/Infrastructure/Database/SnittlistanContext.cs
@@ -1,7 +1,6 @@
#nullable enable
using Npgsql.NameTranslation;
-using System.Data.Entity;
namespace Snittlistan.Web.Infrastructure.Database;
diff --git a/Snittlistan.Web/Snittlistan.Web.csproj b/Snittlistan.Web/Snittlistan.Web.csproj
index a1397c3b..0d8f90e1 100644
--- a/Snittlistan.Web/Snittlistan.Web.csproj
+++ b/Snittlistan.Web/Snittlistan.Web.csproj
@@ -155,6 +155,10 @@
Index.cshtml
+
+
+
+
diff --git a/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml b/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml
index 532e99c0..772863af 100644
--- a/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml
+++ b/Snittlistan.Web/Views/Emails/UpdateRoster.cshtml
@@ -30,7 +30,16 @@ Content-Type: text/html; charset=utf-8
}
-
@Model.FormattedAuditLog.Title
+
+ - Hemmalag
+ - @Model.HomeTeamName
+ - Bortalag
+ - @Model.AwayTeamName
+ - Datum
+ - @Model.MatchDate
+ - Online scoring
+ - @Model.OnlineScoringLink
+
Bord |
diff --git a/Snittlistan.Web/Web.config b/Snittlistan.Web/Web.config
index 30a56855..3a1880f2 100644
--- a/Snittlistan.Web/Web.config
+++ b/Snittlistan.Web/Web.config
@@ -17,7 +17,7 @@
-
+