簡體   English   中英

如何修復找不到合適的構造函數

[英]How to fix No suitable constructor found

我必須使用枚舉安全模式來持久存儲在數據庫中,只是一個枚舉的代碼。 當我嘗試運行遷移時,出現錯誤:

找不到適用於實體類型“ Regiao”的合適構造函數。 以下構造函數的參數無法綁定到實體類型的屬性:無法綁定“ Regiao(int codigo,string nome)”中的“ codigo”,“ nome”

我已經檢查過代碼,將構造方法從受保護的更改為公共的,但是沒有任何效果。

這是基類。

    public abstract class EnumBase<TEnum, TKey> :
        IEquatable<EnumBase<TEnum, TKey>>,
        IComparable<EnumBase<TEnum, TKey>>
        where TEnum : EnumBase<TEnum, TKey>
        where TKey : IEquatable<TKey>, IComparable<TKey>
    {
        private readonly TKey _codigo;

        private readonly string _nome;

        private static readonly List<TEnum> _listaDeEnums = new List<TEnum>();

        private static bool _invoked;

        public TKey Codigo => _codigo;

        public string Nome => _nome;

        public static IReadOnlyCollection<TEnum> ListaDeEnums
        {
            get
            {
                if (!_invoked)
                {
                    _invoked = true;
                    typeof(TEnum).GetProperties(BindingFlags.Public | BindingFlags.Static).FirstOrDefault(p => p.PropertyType == typeof(TEnum))?.GetValue(null, null);
                }

                return _listaDeEnums;
            }
        }

        protected EnumBase(TKey codigo, string nome)
        {
            _nome = nome;
            _codigo = codigo;

            TEnum item = this as TEnum;
            _listaDeEnums.Add(item);
        }

        public static TEnum ObterPorNome(string nome)
        {
            return ListaDeEnums.SingleOrDefault(item => string.Equals(item.Nome, nome, StringComparison.OrdinalIgnoreCase));
        }

        public static TEnum ObterPorCodigo(TKey codigo)
        {
            // Can't use == to compare generics unless we constrain TValue to "class", which we don't want because then we couldn't use int.
            return ListaDeEnums.SingleOrDefault(item => EqualityComparer<TKey>.Default.Equals(item.Codigo, codigo));
        }

        public override string ToString()
        {
            return _nome;
        }

        public virtual bool Equals(EnumBase<TEnum, TKey> other)
        {
            if (ReferenceEquals(null, other))
            {
                return false;
            }

            if (ReferenceEquals(this, other))
            {
                return true;
            }

            if (other.GetType() != GetType())
            {
                return false;
            }

            return _codigo.Equals(other._codigo);
        }

        public int CompareTo(EnumBase<TEnum, TKey> other)
        {
            return _codigo.CompareTo(other._codigo);
        }
    }

這是從EnumBase繼承的類

    public class Regiao : EnumBase<Regiao, int>
    {
        public static Regiao Indefinida { get; } = new Regiao(0, "Indefinida");
        public static Regiao CentroOeste { get; } = new Regiao(1, "Centro-Oeste");
        public static Regiao Nordeste { get; } = new Regiao(2, "Nordeste");
        public static Regiao Norte { get; } = new Regiao(3, "Norte");
        public static Regiao Sudeste { get; } = new Regiao(4, "Sudeste");
        public static Regiao Sul { get; } = new Regiao(5, "Sul");

        public Regiao(int codigo, string nome) : base(codigo, nome) { }
    }

這是我使用Enum Regiao的課程

    public class Estado
    {
        public int ChaveEstadoDne { get; private set; }

        public string SiglaPais2Pos { get; private set; }

        public string Uf { get; private set; }

        public string CodigoIbgeEstado { get; private set; }

        public string NomeOficialEstado { get; private set; }

        public string NomeAbreviadoEstado { get; private set; }

        public Regiao Regiao { get; private set; }

        public Guid PaisId { get; private set; }

        protected Estado()
        {
        }

        private Estado(Guid id, EntityStatus status, DateTime? dataCadastro, TipoProcesso rotina, int chaveEstadoDne, string siglaPais2Pos, string uf, string codigoIbge, string nomeOficial, string nomeAbreviado, Guid paisId) : base(id, chaveEstadoDne.ToString(), status, dataCadastro, rotina)
        {

        }
    }

最后是我做映射的代碼片段

            builder.Property(estado => estado.Regiao)
                .HasColumnName("Regiao")
                .HasConversion(
                    estado => estado.Codigo,
                    estado => Regiao.ObterPorCodigo(estado));

我希望將Codigo字段映射到數據庫,並在讀取Code字段時將其映射回Regiao類型。 但是我得到消息:

System.InvalidOperationException HResult = 0x80131509消息=找不到適用於實體類型“ Regiao”的合適的構造函數。 以下構造函數的參數無法綁定到實體類型的屬性:無法綁定“ Regiao(int codigo,string nome)”中的“ codigo”,“ nome”。 Source = Microsoft.EntityFrameworkCore StackTrace:Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelBuilt(InternalModeler) ModelBuilder.FinalizeModel()在System.Lazy 1.ViaFactory(LazyThreadSafetyMode mode) at System.Lazy 1.ExecutionAndPublication(LazyHelper executionAndPublication,布爾useDefaultConstructor)在System.Lazy 1.CreateValue() at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model() at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor (2.) Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSiteCallSitesScopedited 2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor (DependencyInjection.Service。 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor的ServiceProviderEngineScope范圍) 2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure 2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure 1訪問器)處的Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.get_DatabaseCreator()處的2.VisitCallSite(IServiceCallSite callSite, TArgument argument) at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope scope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type serviceType, ServiceProviderEngineScope serviceProviderEngineScope) at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies() at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure () D:\\ Projects \\ Dev \\ Bigai \\ CepApi \\ src \\ Bigai.CepApi.Data \\ Initializer中的Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.EnsureCreated()在Bigai.CepApi.Data.Initializers.CepApiInitializer.Initialize(CepApiContext上下文) .cs:Bigai.CepApi.Services.Api.Configurations.ApiConfiguration.UseApiConfiguration(IApplicationBuilder app,CepApiContext context,IApiVersionDescriptionProvider provider)中的第17行在D:\\ Projects \\ Dev \\ Bigai \\ CepApi \\ src \\ Bigai.CepApi.Services.Api D:\\ Projects \\ Dev \\ Bigai \\ CepApi \\ src \\ Bigai中的\\ Configurations \\ ApiConfiguration.cs:第48行位於Bigai.CepApi.Services.Api.Startup.Configure(IApplicationBuilder應用,IHostingEnvironment env,CepApiContext上下文,IApiVersionDescriptionProvider提供程序)。 CepApi.Services.Api \\ Startup.cs:第74行

請如何解決此問題?

謝謝@Christopher和@GPW。

我解決了問題。 實際上,解決方案就在我眼前,我所要做的就是為我們的朋友實體框架創建所需的受保護的生成器。

在我的基礎課上

protected EnumBase()

在派生類中:

protected Regiao() : base() { }

這兩個更改解決了問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM