【问题标题】:Add-Migration exception: System.ArgumentNullException: Value cannot be null. Parameter name: property添加迁移异常:System.ArgumentNullException:值不能为空。参数名称:属性
【发布时间】:2018-08-31 09:58:50
【问题描述】:

我将以下代码放入 .NET Core 2.1 控制台应用程序中:

public class ProductsContext : DbContext
    {
        public DbSet<Person> People { get; set; }
        public DbSet<Product> Products { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<PersonProduct>().HasKey(sc => new { sc.PersonId, sc.ProductId });
            modelBuilder.Entity<Product>()
           .ToTable("Product")
           .HasDiscriminator<string>("Description")
           .HasValue<Product1>("Product1")
           .HasValue<Product2>("Product2");

            modelBuilder.Entity<PersonProduct>()
                .HasOne<Person>(sc => sc.Person)
                .WithMany(s => s.PersonProduct)
                .HasForeignKey(sc => sc.PersonId)
                .OnDelete(DeleteBehavior.Cascade);

            modelBuilder.Entity<PersonProduct>()
                .HasOne<Product>(sc => sc.Product)
                .WithMany(s => s.PersonProduct)
                .HasForeignKey(sc => sc.ProductId)
            .OnDelete(DeleteBehavior.Cascade);

            var navigation = modelBuilder.Entity<Person>().Metadata.FindNavigation(nameof(Person));
            navigation.SetPropertyAccessMode(PropertyAccessMode.Field);
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=PQ;Trusted_Connection=True;MultipleActiveResultSets=true");
        }
    }

    public abstract class Product
    {
        public Guid Id { get; private set; }
        public string Description;
        public List<PersonProduct> PersonProduct { get; set; }

        public Product(Guid id)
        {
            Id = id;
        }

    }

    public class Product1 : Product
    {
        public Product1(Guid id)
            : base(id)
        {

        }
    }

    public class Product2 : Product
    {
        public Product2(Guid id)
            : base(id)
        {

        }
    }

    public sealed class Person
    {
        public Guid Id { get; private set; }
        public string Name { get; private set; }
        //public List<PersonSport> PersonSport { get; private set; }
        private readonly List<PersonProduct> _PersonProduct = new List<PersonProduct>();
        public IEnumerable<PersonProduct> PersonProduct => _PersonProduct.AsReadOnly();

        public Person(Guid id, string name)
        {
            Id = id;
            Name = name;
        }

        public void AddEntry(PersonProduct PersonProduct)
        {
            _PersonProduct.Add(PersonProduct);
        }

    }

    public sealed class PersonProduct
    {
        public Person Person { get; set; }
        public Guid PersonId { get; set; }
        public Product Product { get; set; }
        public Guid ProductId { get; set; }
    }

我在 Nuget 包管理器控制台中运行了以下命令:ADD-MIGRATION InitialCreate

我得到的错误是:

System.ArgumentNullException:值不能为空。参数名称: 财产在 Microsoft.EntityFrameworkCore.Utilities.Check.NotNull[T](T 值, 字符串参数名称)在 Microsoft.EntityFrameworkCore.MutablePropertyBaseExtensions.SetPropertyAccessMode(IMutablePropertyBase 属性,Nullable1 propertyAccessMode) at ConsoleApp1.ProductsContext.OnModelCreating(ModelBuilder modelBuilder) in C:\GenieDevelopment\REST\ConsoleApp1\Program.cs:line 42 at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator) at System.Lazy1.ViaFactory(LazyThreadSafetyMode 模式)
在 System.Lazy1.ExecutionAndPublication(LazyHelper executionAndPublication, Boolean useDefaultConstructor) at System.Lazy1.CreateValue() 在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() 在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite、ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite,ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite、ServiceProviderEngineScope 范围)在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider 提供者,类型 serviceType) 在 Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider 提供者)在 Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
在 Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider() 在 Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure1 accessor) at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func1 工厂)在 Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(字符串 上下文类型)在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串 名称,字符串 outputDir,字符串 contextType)在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(字符串 名称,字符串 outputDir,字符串 contextType)在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(操作 动作)值不能为空。参数名称:属性

有什么问题?我花了两个小时谷歌搜索这个,我还没有找到答案。比如我看过这里:Add-Migration Value cannot be null. Parameter name: language

【问题讨论】:

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


    【解决方案1】:

    似乎navigation 变量为空 - FindNavigationPerson 类中找不到名称为“Person”的属性。

    我想你想做这样的事情:

            var navigation = modelBuilder.Entity<Person>().Metadata.FindNavigation(nameof(PersonProduct));
            navigation.SetPropertyAccessMode(PropertyAccessMode.Field);
    

    【讨论】:

      猜你喜欢
      • 2018-08-15
      • 1970-01-01
      • 2019-08-17
      • 2018-06-03
      • 2010-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-03-01
      • 2021-10-23
      相关资源
      最近更新 更多