【问题标题】:EntityFramework core model relationship issue while doing Add-Migration进行添加迁移时的EntityFramework核心模型关系问题
【发布时间】:2016-12-08 05:11:47
【问题描述】:

在 asp.net 核心项目中使用包管理器控制台进行迁移时,我遇到了 EntityFramework 核心模型关系问题。

添加迁移“Add-Migration”时出现以下错误。

无法确定“ICollection”类型的导航属性“College.Users”表示的关系。要么手动配置关系,要么从模型中忽略此属性。

完全错误

System.InvalidOperationException:无法确定“ICollection”类型的导航属性“College.Users”表示的关系。手动配置关系,或从模型中忽略此属性。 在 Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.PropertyMappingValidationConvention.Apply(InternalModelBuilder modelBuilder) 在 Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal.ConventionDispatcher.OnModelBuilt(InternalModelBuilder modelBuilder) 在 Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext 上下文,IConventionSetBuilder 约定集生成器,IModelValidator 验证器) 在 System.Collections.Concurrent.ConcurrentDictionary2.GetOrAdd(TKey key, Func2 valueFactory) 在 Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel() 在 Microsoft.EntityFrameworkCore.Internal.LazyRef1.get_Value() at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService[T](IServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transientCallSite, ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProvider.<>c__DisplayClass16_0.<RealizeService>b__0(ServiceProvider provider) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider provider, Type serviceType) at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider provider) 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.OperationBase.<>c__DisplayClass3_01.b__0() 在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(动作动作) 无法确定“ICollection”类型的导航属性“College.Users”表示的关系。要么手动配置关系,要么从模型中忽略此属性。

我有以下型号

public class College
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("name")]
    public string CollegeName { get; set; }

    [ForeignKey("Users")]
    [JsonProperty("users")]
    public ICollection<User> Users { get; set; }
}

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    [JsonProperty("id")]
    public int Id { get; set; }

    [JsonProperty("name")]
    public string UserName { get; set; }

    [JsonProperty("email")]
    public string UserEmail { get; set; }

    [JsonProperty("phone")]
    public string UserPhone { get; set; }

    [ForeignKey("CollegeId")]
    [JsonProperty("college")]
    public College College{ get; set; }
}

请大家对这个问题有所了解。

谢谢

【问题讨论】:

    标签: c# entity-framework entity-framework-migrations


    【解决方案1】:

    简答: 您使用的 ForeignKey 属性错误。删除它,您的迁移应该开始工作:

    public class College
    {
        public int Id { get; set; }
        public string CollegeName { get; set; }
        public ICollection<User> Users { get; set; }
    }
    
    public class User
    {
        public int Id { get; set; }
        public string UserName { get; set; }
        public string UserEmail { get; set; }
        public string UserPhone { get; set; }
        public College College{ get; set; }
    }
    

    长答案: 在您的示例中,您将忽略模型上的外键 ID 属性。相反,您只包括导航属性。按照惯例,您可以通过将外键属性命名为与您所引用的类相同并在末尾添加一个 ID 来包含外键属性。在您的示例中,这将是:

    public int CollegeId {get;set;}
    

    如果您不想遵循此约定,可以使用 ForeignKeyAttribute。例如,假设您想将属性命名为 PrimaryCollegeId。您可以像这样使用 ForeignKeyAttribute 来做到这一点:

    public int PrimaryCollegeId {get;set;}
    [ForeignKey("PrimaryCollegeId")]
    public College College {get;set;}
    

    如果您在同一个表之间有多个关系,通常会使用 ForeignKeyAttribute。例如,如果学生有小学和中学都作为外键。

    【讨论】:

    • 谢谢。但删除 ForeignKey 属性不起作用。
    • 当您删除两个外键属性时,您看到了什么错误?它应该工作:)
    • 我刚刚尝试使用上面的代码启用迁移,它确实有效。
    • 感谢卡斯帕的回答。我解决了这个问题。这是因为,我在大学模型中引用了多个用户对象。
    • 旁注:您不必将属性放在 nav 属性上。您可以将其放在外键本身并引用 nav 属性(反之)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-25
    • 1970-01-01
    • 2021-09-01
    相关资源
    最近更新 更多