【问题标题】:Entity Framework exception: No suitable constructor found for entity type 'CultureInfo'实体框架异常:没有为实体类型“CultureInfo”找到合适的构造函数
【发布时间】:2020-05-29 22:54:34
【问题描述】:

我有这个:

模型类

public class BusinessSelectList
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool IsBusinessGroup { get; set; }
    [NotMapped]
    public bool IsSelected { get; set; } = false;
}

DbContext

public class AppDbContext : DbContext
{
    public AppDbContext(DbContextOptions<AppDbContext> options) : base(options)
    {
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
    }

    public virtual DbQuery<BusinessSelectList> BusinessSelectList { get; set; 

    /** other virtual DbQuery properties **/
}

存储库

public class BusinessRepository :IBusinessRepository
{
    private readonly IHttpContextAccessor _httpAccessor;
    private readonly AppDbContext _context;

    public BusinessRepository(AppDbContext context, IHttpContextAccessor httpAccessor)
    {
        _context = context;
        _httpAccessor = httpAccessor;
    }

    public IEnumerable<BusinessSelectList> GetAsSelectList()
    {
        var query = @"exec webApp.usp_Business_GetAsSelectList @user";
        var p1 = new SqlParameter("user", _httpAccessor.HttpContext.User.Identity.Name);
        return _context.BusinessSelectList.FromSql(query, p1).ToList();
    }
}

错误

实体框架异常:没有为实体找到合适的构造函数 输入“文化信息”

我试图寻找解决方案,但没有找到任何解决方案。这里有什么问题? :/

完整的例外是:

{System.InvalidOperationException: No suitable constructor found for entity type 'CultureInfo'. The following parameters could not be bound to properties of the entity: 'name', 'name', 'useUserOverride', 'cultureData', 'isReadOnly', 'culture', 'culture', 'useUserOverride', 'cultureName', 'textAndCompareCultureName'.
   at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConstructorBindingConvention.Apply(InternalModelBuilder modelBuilder)
   at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.ImmediateConventionScope.OnModelBuilt(InternalModelBuilder modelBuilder)
   at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnModelBuilt(InternalModelBuilder modelBuilder)
   at Microsoft.EntityFrameworkCore.Metadata.Internal.Model.Validate()
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.<>c__DisplayClass5_0.<GetModel>b__1()
   at System.Lazy`1.ViaFactory(LazyThreadSafetyMode mode)
   at System.Lazy`1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor)
   at System.Lazy`1.CreateValue()
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator)
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
   at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_1(IServiceProvider p)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite factoryCallSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope)
   at 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(IServiceCallSite callSite, TArgument argument)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProviderEngineScope scope)
   at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`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.DbContext.get_DbContextDependencies()
   at Microsoft.EntityFrameworkCore.DbContext.get_Model()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbQuery`1.get_EntityType()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbQuery`1.get_EntityQueryable()
   at Microsoft.EntityFrameworkCore.Internal.InternalDbQuery`1.System.Linq.IQueryable.get_Provider()
   at Microsoft.EntityFrameworkCore.RelationalQueryableExtensions.FromSql[TEntity](IQueryable`1 source, RawSqlString sql, Object[] parameters)
   at MBPT.CoreWeb.Repository.BusinessRepository.GetAsSelectList() in C:\Users\czurbanlu\Source\Workspaces\Workspace\MBPT\MBPT.CoreWeb\MBPT.CoreWeb\Repository\BusinessRepository.cs:line 32}

【问题讨论】:

  • 发布完整的异常,包括调用堆栈。不知何故,某个带有 CultureInfo 的对象被传递了。您可以通过Exception.ToString()轻松获得它
  • @PanagiotisKanavos 你是对的,我把它添加到问题中,似乎与InternalModelBuilder 相关的问题。

标签: c# entity-framework-core asp.net-core-2.1


【解决方案1】:

在某个地方,您的某个实体似乎有一个属性,例如:

public CultureInfo Foo { get; set; }

由于CultureInfo 是一个类,Entity Framework 会将其视为一个实体,甚至可能会为其创建一个数据库表,具体取决于您的实体的设置方式。无论哪种情况,当它尝试构建您的对象图时,它都会尝试填充此属性,但不能,因为CultureInfo 没有无参数构造函数。

长短,找到你做这件事的地方,然后把它删掉。如果您需要以某种方式保存文化信息,请保存一些您可以用来稍后获取适当的CultureInfo 实例的内容。但是,您不能在实体本身上使用它。

【讨论】:

  • 谢谢,但重点是,我没有在模型实体中使用CultureInfo,我只在startup.cs 中设置cultureInfo,如果我将其注释掉,错误是一样的://
  • 它在某处。它可能在相关实体中。在项目范围内搜索它。
  • 好的,我做到了。我在 ViewHelper 类中找到了两次,在 ViewModel 类中找到了两次,一次在 startup.cs 中,一次在格式为 xml 的类中,我还没有看到与数据库的关系。它不用作属性,而是方法的内部代码。
  • 该异常表明它将它视为一个实体,这意味着它在某些地方被添加为关系。我只能说继续挖掘。
  • 我找到了! public virtual DbQuery&lt;DataTable&gt; DataTable { get; set; } 抛出的异常它甚至没有被使用^.^
【解决方案2】:

我也遇到了同样的问题。就我而言,我有一个几乎空的数据访问层项目。当我创建一个指向实体类型的导航链接时,问题来了又去,该实体类型在 DbContext 中作为 DbSet 不可用。

例如,下面的代码给出了与 OP 相同的问题:

    public class Organization
    {
        [Key]
        public Guid OrganizationId { get; set; }
        public string Name { get; set; }

        // Navigation properties
        public virtual ICollection<Pipeline> Pipelines { get; set; }
    }

    public class MyContext : DbContext
    {
        public MyContext()
        {
        }

        public MyContext(DbContextOptions<MyContext> dbContextOptions) : base(dbContextOptions)
        {

        }

        public DbSet<Organization> Organizations { get; set; }
}

虽然这段代码没有:

    public class Organization
    {
        [Key]
        public Guid OrganizationId { get; set; }
        public string Name { get; set; }

        // Navigation properties
 // COMMENTED OUT       public virtual ICollection<Pipeline> Pipelines { get; set; }
    }

    public class MyContext : DbContext
    {
        public MyContext()
        {
        }

        public MyContext(DbContextOptions<MyContext> dbContextOptions) : base(dbContextOptions)
        {

        }

        public DbSet<Organization> Organizations { get; set; }
}

这个问题可以通过两种方式解决:

  • 注释掉导航链接
  • 将属性 DbSet&lt;Pipeline&gt; 添加到 DbContext。

【讨论】:

    【解决方案3】:

    对于遇到此问题且没有任何 cmets 或解决方案可以解决您的问题的任何人,请确保您的表实体没有继承自 IDisposable 的某些内容(或者可能只是不继承自 System.Data.DataTable)。

    就我而言,我正在阅读的一些教程(公平地说,可能有点太快了,为了我自己的利益)正在继承“System.Data.DataTable”。我处于“非常快速地尝试 200 件事”模式中,忘记了我是用我的许多表实体之一继承它的。

    您得到的错误非常不具体且含糊不清,因此希望这对那里的人有所帮助!

    【讨论】:

      猜你喜欢
      • 2022-01-20
      • 2019-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-10-14
      相关资源
      最近更新 更多