mirror of
https://github.com/jellyfin/jellyfin.git
synced 2026-01-15 23:58:57 +00:00
Fixed DbContext usage on Provider
This commit is contained in:
@@ -3,6 +3,7 @@ using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using Jellyfin.Database.Providers.SqLite;
|
||||
using Jellyfin.Server.Implementations.DatabaseConfiguration;
|
||||
using MediaBrowser.Common.Configuration;
|
||||
using MediaBrowser.Controller.Configuration;
|
||||
@@ -17,14 +18,15 @@ namespace Jellyfin.Server.Implementations.Extensions;
|
||||
/// </summary>
|
||||
public static class ServiceCollectionExtensions
|
||||
{
|
||||
private static IEnumerable<Type> DatabaseProviderTypes()
|
||||
{
|
||||
yield return typeof(SqliteDatabaseProvider);
|
||||
}
|
||||
|
||||
private static IDictionary<string, JellyfinDbProviderFactory> GetSupportedDbProviders()
|
||||
{
|
||||
var items = new Dictionary<string, JellyfinDbProviderFactory>();
|
||||
foreach (var providerType in AppDomain
|
||||
.CurrentDomain
|
||||
.GetAssemblies()
|
||||
.SelectMany(f => f.GetTypes())
|
||||
.Where(e => e.IsClass && typeof(IJellyfinDatabaseProvider).IsAssignableFrom(e)))
|
||||
foreach (var providerType in DatabaseProviderTypes())
|
||||
{
|
||||
var keyAttribute = providerType.GetCustomAttribute<JellyfinDatabaseProviderKeyAttribute>();
|
||||
if (keyAttribute is null || string.IsNullOrWhiteSpace(keyAttribute.DatabaseProviderKey))
|
||||
@@ -51,15 +53,16 @@ public static class ServiceCollectionExtensions
|
||||
var providers = GetSupportedDbProviders();
|
||||
JellyfinDbProviderFactory? providerFactory = null;
|
||||
|
||||
if (efCoreConfiguration is null)
|
||||
if (efCoreConfiguration?.DatabaseType is null)
|
||||
{
|
||||
// when nothing is setup via new Database configuration, fallback to SqLite with default settings.
|
||||
efCoreConfiguration = new DatabaseConfigurationOptions()
|
||||
{
|
||||
DatabaseType = "SqLite",
|
||||
DatabaseType = "Jellyfin-SqLite",
|
||||
};
|
||||
}
|
||||
else if (!providers.TryGetValue(efCoreConfiguration.DatabaseType, out providerFactory!))
|
||||
|
||||
if (!providers.TryGetValue(efCoreConfiguration.DatabaseType, out providerFactory!))
|
||||
{
|
||||
throw new InvalidOperationException($"Jellyfin cannot find the database provider of type '{efCoreConfiguration.DatabaseType}'. Supported types are {string.Join(", ", providers.Keys)}");
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@
|
||||
<ProjectReference Include="..\MediaBrowser.Controller\MediaBrowser.Controller.csproj" />
|
||||
<ProjectReference Include="..\MediaBrowser.Model\MediaBrowser.Model.csproj" />
|
||||
<ProjectReference Include="..\Jellyfin.Database\Jellyfin.Database.Implementations\Jellyfin.Database.Implementations.csproj" />
|
||||
<ProjectReference Include="..\Jellyfin.Database\Jellyfin.Database.Providers.SqLite\Jellyfin.Database.Providers.SqLite.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
using System;
|
||||
using Jellyfin.Server.Implementations.ValueConverters;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
|
||||
namespace Jellyfin.Server.Implementations
|
||||
{
|
||||
/// <summary>
|
||||
/// Model builder extensions.
|
||||
/// </summary>
|
||||
public static class ModelBuilderExtensions
|
||||
{
|
||||
/// <summary>
|
||||
/// Specify value converter for the object type.
|
||||
/// </summary>
|
||||
/// <param name="modelBuilder">The model builder.</param>
|
||||
/// <param name="converter">The <see cref="ValueConverter{TModel,TProvider}"/>.</param>
|
||||
/// <typeparam name="T">The type to convert.</typeparam>
|
||||
/// <returns>The modified <see cref="ModelBuilder"/>.</returns>
|
||||
public static ModelBuilder UseValueConverterForType<T>(this ModelBuilder modelBuilder, ValueConverter converter)
|
||||
{
|
||||
var type = typeof(T);
|
||||
foreach (var entityType in modelBuilder.Model.GetEntityTypes())
|
||||
{
|
||||
foreach (var property in entityType.GetProperties())
|
||||
{
|
||||
if (property.ClrType == type)
|
||||
{
|
||||
property.SetValueConverter(converter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return modelBuilder;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Specify the default <see cref="DateTimeKind"/>.
|
||||
/// </summary>
|
||||
/// <param name="modelBuilder">The model builder to extend.</param>
|
||||
/// <param name="kind">The <see cref="DateTimeKind"/> to specify.</param>
|
||||
public static void SetDefaultDateTimeKind(this ModelBuilder modelBuilder, DateTimeKind kind)
|
||||
{
|
||||
modelBuilder.UseValueConverterForType<DateTime>(new DateTimeKindValueConverter(kind));
|
||||
modelBuilder.UseValueConverterForType<DateTime?>(new DateTimeKindValueConverter(kind));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||
|
||||
namespace Jellyfin.Server.Implementations.ValueConverters
|
||||
{
|
||||
/// <summary>
|
||||
/// ValueConverter to specify kind.
|
||||
/// </summary>
|
||||
public class DateTimeKindValueConverter : ValueConverter<DateTime, DateTime>
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="DateTimeKindValueConverter"/> class.
|
||||
/// </summary>
|
||||
/// <param name="kind">The kind to specify.</param>
|
||||
/// <param name="mappingHints">The mapping hints.</param>
|
||||
public DateTimeKindValueConverter(DateTimeKind kind, ConverterMappingHints? mappingHints = null)
|
||||
: base(v => v.ToUniversalTime(), v => DateTime.SpecifyKind(v, kind), mappingHints)
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user