.net core 实体框架核心3.1中的复数化器模型名称

.net core 实体框架核心3.1中的复数化器模型名称,.net-core,entity-framework-core,.net Core,Entity Framework Core,我们正在将现有应用程序迁移到.NET core。为此,我们还需要转向代码优先模型 我把数据库搭建成模型。这个很好用。模型以单数形式生成: public partial class Order { [Key] public int Id { get; set; } [StringLength(50)] public string OrderNumber { get; set; } [StringLength(50)

我们正在将现有应用程序迁移到.NET core。为此,我们还需要转向代码优先模型

我把数据库搭建成模型。这个很好用。模型以单数形式生成:

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; }
}
public partial class KappContext : DbContext
{
        public KappContext()
        {
        }

        public KappContext(DbContextOptions<KappContext> options)
            : base(options)
        {
        }

        ...
        public virtual DbSet<Order> Order { get; set; }
        ...
}
db上下文中的引用也是单数形式:

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; }
}
public partial class KappContext : DbContext
{
        public KappContext()
        {
        }

        public KappContext(DbContextOptions<KappContext> options)
            : base(options)
        {
        }

        ...
        public virtual DbSet<Order> Order { get; set; }
        ...
}
这会引发一个异常:

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
SqlException:对象名称“Orders”无效。
Microsoft.Data.SqlClient.SqlCommand+c.b__164_0(任务结果)
System.Threading.Tasks.ContinuationResultTaskFromResultTask.InnerInvoke()
System.Threading.Tasks.Task+c.b__274_0(对象对象对象)
System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
System.Threading.ExecutionContext.RunInternal(ExecutionContext ExecutionContext,ContextCallback回调,对象状态)
System.Threading.Tasks.Task.ExecuteWithThreadLocal(参考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+AsyncEnumerator.InitializeReaderAsync(DbContext,bool结果,CancellationToken CancellationToken)
Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.ExecuteAsync(状态、函数操作、函数验证成功、取消令牌取消令牌)
Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable+AsyncEnumerator.MoveNextAsync()
Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListSync(IQueryable源,CancellationToken CancellationToken)
Microsoft.EntityFrameworkCore.EntityFrameworkQueryableExtensions.ToListSync(IQueryable源,CancellationToken CancellationToken)
OrderController.cs中的Kapp.Controllers.OrderController.Get()
+
var orders=wait\u context.orders
我已经试过使用bricelam复数器了。这在.NET core 3中不再受支持

我还尝试实现一个设计服务,实现IPluralizer接口,但这在.NETCore3中也不再受支持


如何在数据库上下文中实现模型的多重属性命名?

EF Core的默认行为在查询时使用
DbSet ProperName
作为表名

public virtual DbSet<Order> Orders { get; set; }
公共虚拟数据库集命令{get;set;} 你可以覆盖它

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .ToTable("Order");
}
模型创建时受保护的覆盖无效(ModelBuilder ModelBuilder)
{
modelBuilder.Entity()
.ToTable(“订单”);
}

您所说的“IPluralizer在.net core 3中也不再受支持”是什么意思?该界面在Microsoft.EntityFrameworkCore.Design 3.x版中仍然存在,因此绝对受支持。请确保按照3.0突破性更改中的说明正确引用它。Ivan,我尝试了这个,我也遵循了该链接中的建议,但仍然无法找到或引用IPluralizer接口。嗨,这解决了我的问题,但我遇到了另一个问题。当我将反向属性从公共虚拟ICollection ActionListItem{get;set;}更新为公共虚拟ICollection ActionListItems{get;set;}(复数形式)时,我收到错误消息:InvalidOperationException:类型“ActionListItem”的属性“Action”上的InversePropertyAttribute无效。属性“ActionListItem”不是相关类型“Action”的有效导航属性。确保该属性存在并且是有效的引用或集合导航属性。你知道吗?