简体   繁体   中英

How to fix Entity Framework Core error "Value cannot be null. Parameter name: frameworkName"?

Using prerelease of EF Core (3.0.0-preview6.19304.10). When I call DbContext.SaveChanges() , it causes an error

Value cannot be null. Parameter name frameworkName

Here is the context class

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());
        }
    }
}

Models' configurations:

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);
    }
}

And the entities:

        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();
        }

Here is error stack trace

at Microsoft.EntityFrameworkCore.Metadata.Internal.ClrAccessorFactory'1.Create(PropertyInfo propertyInfo, IPropertyBase propertyBase)
at Microsoft.EntityFrameworkCore.Internal.NonCapturingLazyInitializer.EnsureInitialized[TParam,TValue](TValue&target, TParam param, Func'2 valueFactory)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.WritePropertyValue(IPropertyBase propertyBase, Object value)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetProperty(IPropertyBase propertyBase, Object value, Boolean setModified, Boolean isCascadeDelete, CurrentValueType valueType)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.SetProperty(IPropertyBase propertyBase, Object value, Boolean setModified, Boolean isCascadeDelete)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.InternalEntityEntry.AcceptChanges()
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.AcceptAllChanges(IReadOnlyList'1 changedEntries)
at Microsoft.EntityFrameworkCore.ChangeTracking.Internal.StateManager.SaveChanges(Boolean acceptAllChangesOnSuccess)

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

at EFPersistence.Repositories.EFBaseRepository'4.SaveChanges() in C:\\Projects\\EFImplementationRepo\\EFPersistance\\Repositories\\EFBaseRepository.cs:line 154

at EFImplementationRepo.Program.SeedData(EFBaseRepository'4 baseRepository) in C:\\Projects\\EFImplementationRepo\\EFImplementationRepo\\Program.cs:line 31

at EFImplementationRepo.Program.Main() in C:\\Projects\\EFImplementationRepo\\EFImplementationRepo\\Program.cs:line 16

We updated this week our application to EF Core 3.1 and faced an issue with the same error message. The reason was, that we had collection navigation properties without setters. There is already an issue on GitHub .

Currently, DbContext.SaveChanges() is working, exception is thrown after saving data. Such way is working for me:

void CallSaveChanges()
{
    try
    {
        _baseRepository.SaveChanges();
    }
    catch (ArgumentNullException) { }
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM