Skip to content

Commit dc4baea

Browse files
committed
Entity Framework: initial setup
1 parent cf223c3 commit dc4baea

File tree

43 files changed

+1042
-0
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1042
-0
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using System.Data.Common;
2+
using Microsoft.EntityFrameworkCore.Diagnostics;
3+
4+
namespace Ef.Ydb.Diagnostics.Internal;
5+
6+
// TODO: Temporary for debugging
7+
public class YdbCommandInterceptor : DbCommandInterceptor
8+
{
9+
public override InterceptionResult<DbDataReader> ReaderExecuting(
10+
DbCommand command,
11+
CommandEventData eventData,
12+
InterceptionResult<DbDataReader> result
13+
)
14+
{
15+
return result;
16+
}
17+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
using Microsoft.EntityFrameworkCore.Diagnostics;
2+
3+
namespace Ef.Ydb.Diagnostics.Internal;
4+
5+
public class YdbLoggingDefinitions : RelationalLoggingDefinitions
6+
{
7+
}

src/Ef.Ydb/src/Ef.Ydb.csproj

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
3+
<PropertyGroup>
4+
<TargetFramework>net8.0</TargetFramework>
5+
<RootNamespace>Ef.Ydb</RootNamespace>
6+
<Nullable>enable</Nullable>
7+
<PackageId>Ef.Ydb</PackageId>
8+
</PropertyGroup>
9+
10+
<ItemGroup>
11+
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.0" />
12+
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="9.0.0" />
13+
</ItemGroup>
14+
15+
<ItemGroup>
16+
<ProjectReference Include="..\..\Ydb.Sdk\src\Ydb.Sdk.csproj" />
17+
</ItemGroup>
18+
19+
<ItemGroup>
20+
<Reference Include="Microsoft.EntityFrameworkCore.Relational">
21+
<HintPath>..\..\..\..\..\.nuget\packages\microsoft.entityframeworkcore.relational\9.0.0\lib\net8.0\Microsoft.EntityFrameworkCore.Relational.dll</HintPath>
22+
</Reference>
23+
</ItemGroup>
24+
</Project>
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using System;
2+
using Ef.Ydb.Infrastructure;
3+
using Ef.Ydb.Infrastructure.Internal;
4+
using Microsoft.EntityFrameworkCore;
5+
using Microsoft.EntityFrameworkCore.Infrastructure;
6+
7+
namespace Ef.Ydb.Extensions;
8+
9+
public static class YdbContextOptionsBuilderExtensions
10+
{
11+
public static DbContextOptionsBuilder UseEfYdb(
12+
this DbContextOptionsBuilder optionsBuilder,
13+
string? connectionString,
14+
Action<YdbDbContextOptionsBuilder>? efYdbOptionsAction = null
15+
)
16+
{
17+
var extension = GetOrCreateExtension(optionsBuilder).WithConnectionString(connectionString);
18+
((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(extension);
19+
20+
ConfigureWarnings(optionsBuilder);
21+
22+
efYdbOptionsAction?.Invoke(new YdbDbContextOptionsBuilder(optionsBuilder));
23+
return optionsBuilder;
24+
}
25+
26+
// TODO: Right now there are no arguments for constructor, so probably it's ok
27+
private static YdbOptionsExtension GetOrCreateExtension(DbContextOptionsBuilder options)
28+
=> options.Options.FindExtension<YdbOptionsExtension>()
29+
?? new YdbOptionsExtension();
30+
31+
private static void ConfigureWarnings(DbContextOptionsBuilder optionsBuilder)
32+
{
33+
var coreOptionsExtension = optionsBuilder.Options.FindExtension<CoreOptionsExtension>()
34+
?? new CoreOptionsExtension();
35+
36+
coreOptionsExtension = RelationalOptionsExtension.WithDefaultWarningConfiguration(coreOptionsExtension);
37+
((IDbContextOptionsBuilderInfrastructure)optionsBuilder).AddOrUpdateExtension(coreOptionsExtension);
38+
}
39+
}
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
using Ef.Ydb.Diagnostics.Internal;
2+
using Ef.Ydb.Infrastructure;
3+
using Ef.Ydb.Infrastructure.Internal;
4+
using Ef.Ydb.Metadata.Conventions;
5+
using Ef.Ydb.Metadata.Internal;
6+
using Ef.Ydb.Migrations;
7+
using Ef.Ydb.Migrations.Internal;
8+
using Ef.Ydb.Query.Internal;
9+
using Ef.Ydb.Storage.Internal;
10+
using Ef.Ydb.Update.Internal;
11+
using Microsoft.EntityFrameworkCore.Diagnostics;
12+
using Microsoft.EntityFrameworkCore.Infrastructure;
13+
using Microsoft.EntityFrameworkCore.Metadata;
14+
using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure;
15+
using Microsoft.EntityFrameworkCore.Migrations;
16+
using Microsoft.EntityFrameworkCore.Query;
17+
using Microsoft.EntityFrameworkCore.Storage;
18+
using Microsoft.EntityFrameworkCore.Update;
19+
using Microsoft.Extensions.DependencyInjection;
20+
21+
namespace Ef.Ydb.Extensions;
22+
23+
public static class YdbServiceCollectionExtensions
24+
{
25+
public static IServiceCollection AddEntityFrameworkYdb(this IServiceCollection serviceCollection)
26+
{
27+
new EntityFrameworkYdbServicesBuilder(serviceCollection)
28+
.TryAdd<LoggingDefinitions, YdbLoggingDefinitions>()
29+
.TryAdd<IDatabaseProvider, DatabaseProvider<YdbOptionsExtension>>()
30+
.TryAdd<IRelationalTypeMappingSource, YdbTypeMappingSource>()
31+
.TryAdd<ISqlGenerationHelper, YdbSqlGenerationHelper>()
32+
.TryAdd<IRelationalAnnotationProvider, YdbAnnotationProvider>()
33+
.TryAdd<IModelValidator, YdbModelValidator>()
34+
.TryAdd<IProviderConventionSetBuilder, YdbConventionSetBuilder>()
35+
.TryAdd<IUpdateSqlGenerator, YdbUpdateSqlGenerator>()
36+
.TryAdd<IModificationCommandFactory, YdbModificationCommandFactory>()
37+
.TryAdd<IModificationCommandBatchFactory, YdbModificationCommandBatchFactory>()
38+
.TryAdd<IRelationalConnection>(p => p.GetRequiredService<IYdbRelationalConnection>())
39+
.TryAdd<IMigrationsSqlGenerator, YdbMigrationsSqlGenerator>()
40+
.TryAdd<IRelationalDatabaseCreator, YdbDatabaseCreator>()
41+
.TryAdd<IHistoryRepository, YdbHistoryRepository>()
42+
.TryAdd<IQueryableMethodTranslatingExpressionVisitorFactory,
43+
YdbQueryableMethodTranslatingExpressionVisitorFactory>()
44+
.TryAdd<IMethodCallTranslatorProvider, YdbMethodCallTranslatorProvider>()
45+
.TryAdd<IAggregateMethodCallTranslatorProvider, YdbAggregateMethodCallTranslatorProvider>()
46+
.TryAdd<IMemberTranslatorProvider, YdbMemberTranslatorProvider>()
47+
.TryAdd<IQuerySqlGeneratorFactory, YdbQuerySqlGeneratorFactory>()
48+
.TryAdd<IRelationalSqlTranslatingExpressionVisitorFactory, YdbSqlTranslatingExpressionVisitorFactory>()
49+
.TryAdd<IQueryTranslationPostprocessorFactory, YdbQueryTranslationPostprocessorFactory>()
50+
.TryAdd<IRelationalParameterBasedSqlProcessorFactory, YdbParameterBasedSqlProcessorFactory>()
51+
.TryAdd<ISqlExpressionFactory, YdbSqlExpressionFactory>()
52+
.TryAdd<IQueryCompilationContextFactory, YdbQueryCompilationContextFactory>()
53+
.TryAddProviderSpecificServices(
54+
b => b
55+
.TryAddScoped<IYdbRelationalConnection, YdbRelationalConnection>()
56+
.TryAddScoped<IDbCommandInterceptor, YdbCommandInterceptor>())
57+
.TryAddCoreServices();
58+
59+
return serviceCollection;
60+
}
61+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using Microsoft.EntityFrameworkCore.Infrastructure;
4+
using Microsoft.Extensions.DependencyInjection;
5+
6+
namespace Ef.Ydb.Infrastructure;
7+
8+
public class EntityFrameworkYdbServicesBuilder : EntityFrameworkRelationalServicesBuilder
9+
{
10+
private static readonly IDictionary<Type, ServiceCharacteristics> YdbServices
11+
= new Dictionary<Type, ServiceCharacteristics>
12+
{
13+
// TODO: Add items if required
14+
};
15+
16+
public EntityFrameworkYdbServicesBuilder(IServiceCollection serviceCollection) : base(serviceCollection)
17+
{
18+
}
19+
20+
protected override ServiceCharacteristics GetServiceCharacteristics(Type serviceType)
21+
{
22+
var contains = YdbServices.TryGetValue(serviceType, out var characteristics);
23+
return contains
24+
? characteristics
25+
: base.GetServiceCharacteristics(serviceType);
26+
}
27+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Microsoft.EntityFrameworkCore.Infrastructure;
2+
3+
namespace Ef.Ydb.Infrastructure.Internal;
4+
5+
// TODO: Not required for mvp
6+
public class YdbModelValidator : RelationalModelValidator
7+
{
8+
public YdbModelValidator(
9+
ModelValidatorDependencies dependencies,
10+
RelationalModelValidatorDependencies relationalDependencies
11+
) : base(dependencies, relationalDependencies)
12+
{
13+
}
14+
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using System.Collections.Generic;
2+
using Ef.Ydb.Extensions;
3+
using Microsoft.EntityFrameworkCore.Infrastructure;
4+
using Microsoft.Extensions.DependencyInjection;
5+
6+
namespace Ef.Ydb.Infrastructure.Internal;
7+
8+
public class YdbOptionsExtension : RelationalOptionsExtension
9+
{
10+
private DbContextOptionsExtensionInfo? _info;
11+
12+
public YdbOptionsExtension()
13+
{
14+
}
15+
16+
protected YdbOptionsExtension(YdbOptionsExtension copyFrom) : base(copyFrom)
17+
{
18+
}
19+
20+
protected override RelationalOptionsExtension Clone()
21+
=> new YdbOptionsExtension(this);
22+
23+
public override void ApplyServices(IServiceCollection services)
24+
=> services.AddEntityFrameworkYdb();
25+
26+
public override DbContextOptionsExtensionInfo Info
27+
=> _info ??= new ExtensionInfo(this);
28+
29+
private sealed class ExtensionInfo(IDbContextOptionsExtension extension) : RelationalExtensionInfo(extension)
30+
{
31+
private new YdbOptionsExtension Extension
32+
=> (YdbOptionsExtension)base.Extension;
33+
34+
public override bool IsDatabaseProvider => true;
35+
36+
// TODO: Right now it's stub
37+
public override void PopulateDebugInfo(IDictionary<string, string> debugInfo)
38+
{
39+
debugInfo["Hello"] = "World!";
40+
}
41+
}
42+
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
using Ef.Ydb.Infrastructure.Internal;
2+
using Microsoft.EntityFrameworkCore;
3+
using Microsoft.EntityFrameworkCore.Infrastructure;
4+
5+
namespace Ef.Ydb.Infrastructure;
6+
7+
public class YdbDbContextOptionsBuilder
8+
: RelationalDbContextOptionsBuilder<YdbDbContextOptionsBuilder, YdbOptionsExtension>
9+
{
10+
public YdbDbContextOptionsBuilder(DbContextOptionsBuilder optionsBuilder) : base(optionsBuilder)
11+
{
12+
}
13+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
using Microsoft.EntityFrameworkCore.Metadata.Conventions.Infrastructure;
2+
3+
namespace Ef.Ydb.Metadata.Conventions;
4+
5+
public class YdbConventionSetBuilder
6+
: RelationalConventionSetBuilder
7+
{
8+
public YdbConventionSetBuilder(
9+
ProviderConventionSetBuilderDependencies dependencies,
10+
RelationalConventionSetBuilderDependencies relationalDependencies
11+
) : base(dependencies, relationalDependencies)
12+
{
13+
}
14+
}

0 commit comments

Comments
 (0)