【问题标题】:Pluralizer model names in entity framework core 3.1实体框架核心 3.1 中的 Pluralizer 模型名称
【发布时间】:2020-06-18 01:01:02
【问题描述】:

我们正在将现有应用程序迁移到 .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 也不再支持。

如何在我的数据库上下文中为我的模型提供多元化的属性命名?

【问题讨论】:

  • “.net core 3 也不再支持 IPluralizer”是什么意思?该接口仍然存在于 Microsoft.EntityFrameworkCore.Design 3.x 版中,因此绝对受支持。只需确保按照 3.0 重大更改中的说明正确引用它 - Microsoft.EntityFrameworkCore.Design is now a DevelopmentDependency package
  • Ivan,我试过了,我也按照该链接的建议进行操作,但仍然找不到或引用 IPluralizer 界面。

标签: .net-core entity-framework-core


【解决方案1】:

查询时,EF Core 的默认行为使用DbSet&lt;T&gt; ProperName 作为表名。

public virtual DbSet<Order> Orders { get; set; }

你可以覆盖它

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Order>()
        .ToTable("Order");
}

【讨论】:

  • 嗨,这解决了我的问题,但我遇到了另一个问题。当我从公共虚拟 ICollection ActionListItem { get; 更新逆属性时放; } to public virtual ICollection ActionListItems { get;放; (复数形式),我收到错误消息: InvalidOperationException:类型“ActionListItem”的属性“Action”上的 InversePropertyAttribute 无效。属性“ActionListItem”不是相关类型“操作”的有效导航属性。确保该属性存在并且是有效的引用或集合导航属性。有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
  • 2021-07-14
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2018-05-13
  • 2017-04-03
相关资源
最近更新 更多