当我尝试使用Add-Migration时,出现此错误:



现在,我知道实体需要键,并且它具有一个键,但是到目前为止,仅使用[Key]装饰一个属性就可以完成这项工作,但是现在看来不再如此。所以我有以下实体:

public class Configuration
{
    [Key, ForeignKey("Client")]
    public int ClientId { get; set; }

    public CommunicationType CommunicationType { get; set; }

    public string CommunicationValue { get; set; }

    public virtual Client Client { get; set; }
}

但是搜索了一段时间之后,我发现EF7显然不希望违反其约定,因此我需要将ClientId重命名为ConfigurationId,但这似乎对我的编码约定来说是错误的。我是否需要改变自己的方式,还是有办法绕过它?提前致谢。

编辑

这是Client实体,是的,那里有一个Configuration属性
public class Client
{
    [Key]
    public int ClientId { get; set; }

    public string Name { get; set; }

    public virtual User User { get; set; }

    public virtual List<Station> Stations { get; set; }

    public Configuration Configuration { get; set; }
}

编辑

完整的错误日志:

System.InvalidOperationException:实体类型“配置”要求定义一个主键。
在Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError(字符串消息)
在Microsoft.EntityFrameworkCore.Internal.ModelValidator.EnsureNonNullPrimaryKeys(IModel模型)
在Microsoft.EntityFrameworkCore.Internal.ModelValidator.Validate(IModel模型)
在Microsoft.EntityFrameworkCore.Internal.RelationalModelValidator.Validate(IModel模型)
在Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext上下文,IConventionSetBuilder ConventionSetBuilder,IModelValidator验证器)中
在Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.c__DisplayClass14_0.b__0(Object k)中
在System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey键,Func`2 valueFactory)中
在Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext上下文,IConventionSetBuilder ConventionSetBuilder,IModelValidator验证程序)中
在Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()中
在Microsoft.EntityFrameworkCore.Internal.LazyRef`1.get_Value()中
在Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()中
在Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServiceCollectionExtensions.c.b__0_6(IServiceProvider p)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactoryService(FactoryService factoryService,ServiceProvider provider)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped(ScopedCallSite scopedCallSite,ServiceProvider提供程序)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中
在Microsoft.Extensions.DependencyInjection.ServiceProvider.c__DisplayClass16_0.b__0(ServiceProvider提供程序)
在Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型serviceType)
在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetService [T](IServiceProvider提供程序)中
在Microsoft.EntityFrameworkCore.Design.Internal.DesignTimeServicesBuilder.c__DisplayClass6_0.b__9(IServiceProvider _)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactoryService(FactoryService factoryService,ServiceProvider provider)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transitionCallSite,ServiceProvider提供程序)
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite constructorCallSite,ServiceProvider provider)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitTransient(TransientCallSite transitionCallSite,ServiceProvider提供程序)
在Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor`2.VisitCallSite(IServiceCallSite callSite,TArgument参数)中
在Microsoft.Extensions.DependencyInjection.ServiceProvider.c__DisplayClass16_0.b__0(ServiceProvider提供程序)
在Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(类型serviceType)
在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider提供者,类型serviceType)
在Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService [T](IServiceProvider提供程序)中
在Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration(字符串名称,字符串outputDir,字符串contextType)
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl(String name,String outputDir,String contextType)中
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration.c__DisplayClass0_1.b__0()中
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.c__DisplayClass3_0`1.b__0()中
在Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action操作)中
实体类型“配置”要求定义主键。

最佳答案

您是否尝试过将ForeignKey属性移动到Navigation属性?

public class Configuration
{
    [Key]
    public int ClientId { get; set; }

    public CommunicationType CommunicationType { get; set; }

    public string CommunicationValue { get; set; }

    [ForeignKey("ClientId")]
    public virtual Client Client { get; set; }
}

关于c# - 实体类型 'Configuration'需要定义主键,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41964707/

10-09 23:45