如何解决“无法确定的关系,”在多个多对多的关系?

问题描述 投票:-1回答:1

我想实现两个实体之间的两许多一对多的关系,但增加了迁移过程不顺利。我喜欢通过属性来解决这个问题,而不是流利的API ...

请帮我。

该加载迁移过程的消息:

System.InvalidOperationException: Unable to determine the relationship represented by navigation property 'Exercise.AssignedStudents' of type 'ICollection<Student>'. Either manually configure the relationship, or ignore this property using the '[NotMapped]' attribute or by using 'EntityTypeBuilder.Ignore' in 'OnModelCreating'.
at Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.PropertyMappingValidationConvention.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.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.GetRelationalService[TService](IInfrastructure`1 databaseFacade)
at Microsoft.EntityFrameworkCore.RelationalDatabaseFacadeExtensions.SetCommandTimeout(DatabaseFacade databaseFacade, Nullable`1 timeout)
at BL.PTAContext..ctor(DbContextOptions`1 options) in D:\projects\private-teaching-admin\DAL\PTAContext.cs:line 11
at lambda_method(Closure )
at Microsoft.EntityFrameworkCore.Internal.DbContextPool`1.Rent()
at Microsoft.EntityFrameworkCore.Internal.DbContextPool`1.Lease..ctor(DbContextPool`1 contextPool)
 End of stack trace from previous location where exception was thrown ---
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.GetService[T](IServiceProvider provider)
at Microsoft.Extensions.DependencyInjection.EntityFrameworkServiceCollectionExtensions.<>c__5`2.<AddDbContextPool>b__5_2(IServiceProvider sp)
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.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.ActivatorUtilities.GetServiceOrCreateInstance(IServiceProvider provider, Type type)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.<>c__DisplayClass12_2.<FindContextTypes>b__11()
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func`1 factory)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(String contextType)
at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name, String outputDir, String contextType)
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.<>c__DisplayClass0_1.<.ctor>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.<>c__DisplayClass3_0`1.<Execute>b__0()
at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)

我已经使用在所有的4财产(双向)的InverseProperty属性审判,只是在entites的(单向)之一。

public class Exercise : ExpirableModel
{
    public string Name { get; set; }
    public string Description { get; set; }
    public ExerciseLevel Level { get; set; }
    public Guid TeacherId { get; set; }

    public virtual ICollection<Label> Labels { get; set; } = new HashSet<Label>();

    [InverseProperty("AssignedExercises")]
    public virtual ICollection<Student> AssignedStudents { get; set; } = new HashSet<Student>();

    [InverseProperty("FinishedExercises")]
    public virtual ICollection<Student> FinishedStudents { get; set; } = new HashSet<Student>();

    [ForeignKey("TeacherId")]
    public virtual Teacher Teacher { get; set; }
}

public class Student : User
{
    public Guid UserId { get; set; }
    public Guid AddressId { get; set; }
    public Guid DefaultInvoicingInfoId { get; set; }

    public int AverageBusinessQuality
    {
        get
        {
            throw new NotImplementedException();

            //return FunFactor * Sessions.Count;
        }
    }

    public int FunFactor
    {
        get
        {
            return Sessions.Sum(x => x.FunLevel) / Sessions.Count;
        }
    }

    public int ActiveHourlyRateValue
    {
        get
        {
            IEnumerable<int> values = HourlyRates
                .Where(x => x.ValidUntilDate >= DateTime.Now)
                .Select(x => x.Value);

            if (values.Count() != 1)
            {
                throw new ExpirationException("SystemError: Number of active hourlyRate is not one!");
            }
            else
            {
                return values.First();
            }
        }
    }

    public int ActiveDiscountValue
    {
        get
        {
            IEnumerable<int> values = Discounts
                .Where(x => x.ValidUntilDate >= DateTime.Now)
                .Select(x => x.Value);

            if (values.Count() != 1)
            {
                throw new ExpirationException("SystemError: Number of active discounts is not 1!");
            }
            else
            {
                return values.First();
            }
        }
    }

    public int BusinessQuality
    {
        get
        {
            throw new NotImplementedException();
        }
    }

    [ForeignKey("UserId")]
    public virtual User User { get; set; }

    [ForeignKey("AddressId")]
    public virtual Address Address { get; set; }

    [ForeignKey("DefaultInvoicingInfoId")]
    public virtual InvoicingInfo DefaultInvoicingInfo { get; set; }

    public virtual ICollection<Teacher> Teachers { get; set; } = new HashSet<Teacher>();

    //[InverseProperty("AssignedStudents")]
    public virtual ICollection<Exercise> AssignedExercises { get; set; } = new HashSet<Exercise>();

    //[InverseProperty("FinishedStudents")]
    public virtual ICollection<Exercise> FinishedExercises { get; set; } = new HashSet<Exercise>();

    public virtual ICollection<HourlyRate> HourlyRates { get; set; } = new HashSet<HourlyRate>();
    public virtual ICollection<Discount> Discounts { get; set; } = new HashSet<Discount>();
    public virtual ICollection<InvoicingInfo> InvoicingInfos { get; set; } = new HashSet<InvoicingInfo>();
    public virtual ICollection<Session> Sessions { get; set; } = new HashSet<Session>();

    public int GetBusinessQuality(Teacher teacher)
    {
        throw new NotImplementedException();
    }
}
c# .net entity-framework .net-core ef-core-2.1
1个回答
0
投票

许多一对多的关系,实体框架的核心,不支持现在。

有对netcoreapp3.0发布支持许多一对多的关系,其下#10508跟踪的路线图/计划

© www.soinside.com 2019 - 2024. All rights reserved.