Как исправить ошибку 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) { }
}