Как исправить ошибку Entity Framework Core "Значение не может быть нулевым. Имя параметра: frameworkName"?

Использование предварительной версии EF Core (3.0.0-preview6.19304.10). Когда я звоню DbContext.SaveChanges(), это вызывает ошибку

Значение не может быть нулевым. Имя параметра frameworkName

Вот контекстный класс

using EFPersistence.Configurations;
using EFPersistence.Models;
using Microsoft.EntityFrameworkCore;

namespace EFPersistence.Contexts
{
    public class EFContext : DbContext
    {
        public EFContext() : base()
        {
        }

        public DbSet<ISRSetting> ISRSettings { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Data Source=DESKTOP-4S1AA2T\SQLEXPRESS;Initial Catalog=TestEF;Integrated Security=True");
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.ApplyConfiguration(new ISRSettingsConfiguration());
            modelBuilder.ApplyConfiguration(new ISRDemographicSettingsConfiguration());
        }
    }
}

Конфигурации моделей:

public class ISRSettingsConfiguration : IEntityTypeConfiguration<ISRSetting>
{
    public void Configure(EntityTypeBuilder<ISRSetting> builder)
    {
        // PK
        builder.HasKey(p => p.Id).ForSqlServerIsClustered();
        builder.Property(p => p.Id)
            .ValueGeneratedOnAdd();

        builder.ToTable("ISRSettings");
    }
}

public class ISRDemographicSettingsConfiguration : IEntityTypeConfiguration<ISRDemographicSetting>
{
    public void Configure(EntityTypeBuilder<ISRDemographicSetting> builder)
    {
        // PK
        builder.HasKey(p => p.Id).ForSqlServerIsClustered();
        builder.Property(p => p.Id)
            .ValueGeneratedOnAdd();

        builder.ToTable("ISRSettingsDemographics");

        // FK
        builder
            .HasOne(p => p.ISRSettings)
            .WithMany(p => p.DemographicsSettings)
            .HasForeignKey(p => p.ISRSettingsId)
            .OnDelete(DeleteBehavior.Cascade);
    }
}

И сущности:

        static void SeedData(EFBaseRepository<EFContext, ISRSetting, ISRSetting, int> baseRepository)
        {
            Console.WriteLine("Adding 1 entity");
            baseRepository.Add(CreateISRSettings(0)); // Works: 
            Console.WriteLine("Added 1 entity");
            baseRepository.SaveChanges();
        }

Вот трассировка стека ошибок

в Microsoft.EntityFrameworkCore.Metadata.Internal.ClrAccessorFactory'1.Create(PropertyInfo propertyInfo, IPropertyBase propertyBase)
в Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam,TValue](TValue&target, параметр TParam, Func'2 valueFactory)
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.WritePropertyValue(IPropertyBase propertyBase, значение объекта)
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetProperty(IPropertyBase propertyBase, значение объекта, логическое значение setModified, логическое значение isCascadeDelete, значение параметра CurrentValueType valueType)
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetProperty(IPropertyBase propertyBase, значение объекта, логическое значение setModified, логическое значение isCascadeDelete)
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.AcceptChanges()
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.AcceptAllChanges(IReadOnlyList'1 changesEntries)
в Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)

в Microsoft.EntityFrameworkCore.DbContext.SaveChanges(Boolean acceptAllChangesOnSuccess)

в EFPersistence.Repositories.EFBaseRepository'4.SaveChanges() в C:\Projects\EFImplementationRepo\EFPersistance\Repositories\EFBaseRepository.cs: строка 154

в EFImplementationRepo.Program.SeedData(EFBaseRepository'4 baseRepository) в C:\Projects\EFImplementationRepo\EFImplementationRepo\Program.cs: строка 31

в EFImplementationRepo.Program.Main() в C:\Projects\EFImplementationRepo\EFImplementationRepo\Program.cs: строка 16

3 ответа

На этой неделе мы обновили наше приложение до EF Core 3.1 и столкнулись с проблемой с тем же сообщением об ошибке. Причина в том, что у нас были свойства навигации по коллекции без сеттеров. На GitHub уже есть проблема.

Просто хотел поместить это здесь на случай, если у кого-то еще возникла эта проблема.

Это происходило и со мной для веб-приложения .Net Framework, это было действительно странно, потому что это случилось только с одним из наших клиентов, остальные были в порядке. В итоге я обнаружил, что тот, который не работал, не имел установленной целевой среды выполнения http, поэтому он работал под .net 4.0, из-за чего он выдавал это исключение каждый раз, когда ef core пытался инициализировать коллекцию, которая была установить только для чтения.

Таким образом, исправление заключалось в изменении среды выполнения http на ту, которую мы использовали (4.7.2), и это было отсортировано.

      <httpRuntime requestValidationMode="2.0" targetFramework="4.7.2" executionTimeout="600" />

В настоящее время, DbContext.SaveChanges() работает, исключение выдается после сохранения данных. У меня такой способ работает:

void CallSaveChanges()
{
    try
    {
        _baseRepository.SaveChanges();
    }
    catch (ArgumentNullException) { }
}
Другие вопросы по тегам