.net-core - 实体框架核心 3.1 中的 Pluralizer 模型名称
问题描述
我们正在将现有应用程序迁移到 .NET 核心。为此,我们还需要转向代码优先模型。
我将我们的数据库搭建为模型。这工作正常。模型以单数形式生成:
public partial class Order
{
[Key]
public int Id { get; set; }
[StringLength(50)]
public string OrderNumber { get; set; }
[StringLength(50)]
public string AssemblyUnitName { get; set; }
[StringLength(50)]
public string Serial { get; set; }
}
db 上下文中的引用也是单数形式:
public partial class KappContext : DbContext
{
public KappContext()
{
}
public KappContext(DbContextOptions<KappContext> options)
: base(options)
{
}
...
public virtual DbSet<Order> Order { get; set; }
...
}
为了减少重构过多代码的影响,我们希望数据库上下文中的模型采用复数形式,例如:
public virtual DbSet<Order> Orders { get; set; }
当我这样做时,只需重命名并执行一些代码,例如:
var orders = await _context.Orders
.OrderBy(ot => ot.OrderNumber)
.AsNoTracking()
.ToListAsync();
这会引发异常:
SqlException: Invalid object name 'Orders'.
Microsoft.Data.SqlClient.SqlCommand+<>c.<ExecuteDbDataReaderAsync>b__164_0(Task<SqlDataReader> result)
System.Threading.Tasks.ContinuationResultTaskFromResultTask<TAntecedentResult, TResult>.InnerInvoke()
System.Threading.Tasks.Task+<>c.<.cctor>b__274_0(object obj)
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, object state)
System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, object state)
System.Threading.Tasks.Task.ExecuteWithThreadLocal(ref Task currentTaskSlot, Thread threadPoolThread)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteReaderAsync(RelationalCommandParameterObject parameterObject, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable<T>+AsyncEnumerator.InitializeReaderAsync(DbContext _, bool result, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync<TState, TResult>(TState state, Func<DbContext, TState, CancellationToken, Task<TResult>> operation, Func<DbContext, TState, CancellationToken, Task<ExecutionResult<TResult>>> verifySucceeded, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable<T>+AsyncEnumerator.MoveNextAsync()
Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync<TSource>(IQueryable<TSource> source, CancellationToken cancellationToken)
Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListAsync<TSource>(IQueryable<TSource> source, CancellationToken cancellationToken)
Kapp.Controllers.OrderController.Get() in OrderController.cs
+
var orders = await _context.Orders
我已经尝试使用 bricelam 复数形式。.NET core 3 不再支持此功能。
我还尝试实现设计服务,实现 IPluralizer 接口,但这在 .NET core 3 中也不再支持。
我怎样才能在我的数据库上下文中为我的模型提供多元化的属性命名?
解决方案
查询时,EF Core 的默认行为DbSet<T> ProperName
用作表名。
public virtual DbSet<Order> Orders { get; set; }
你可以覆盖它
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Order>()
.ToTable("Order");
}
推荐阅读
- liquibase - 将 Liquibase 集成到您的 gitlab-ci 管道中的最佳方法是什么?
- mysql - Docker:在停止的容器中编辑“my.cnf”文件
- node.js - 无法获取某些电子邮件的 Internet 邮件标头
- cmd - MSDeploy -setParam 选项将连接字符串中的 `"""` 替换为`"""`
- javascript - 如何使用 jsreport 和 jsreport Chrome Pdf 渲染 1k pdf 文件?
- python - 如何通过引用 numpy 数组的坐标来处理奇怪的索引行为?
- angular - LoaderController Ionic 4 从组件或页面中隐藏
- java - SurfaceTexture Android Camera2
- scala - Spark Dataframes:将条件列添加到数据框
- ios - Firebase 控制台在验证 iOS 应用上的安装时卡住