C# &引用;实体类型';CustomAttributeData';需要定义主键;在EF Core中添加迁移时出错

C# &引用;实体类型';CustomAttributeData';需要定义主键;在EF Core中添加迁移时出错,c#,asp.net-core,ef-code-first,entity-framework-core,C#,Asp.net Core,Ef Code First,Entity Framework Core,我把我的模型放在一个有核心的类库中。我已经做了第一次迁移来测试我的模型的一部分,但是在一次大的增强之后,我删除了我的数据库和迁移,只进行了一次V1迁移 问题是,在这次删除之后,当我尝试添加迁移时,会出现以下错误: System.InvalidOperationException: The entity type 'CustomAttributeData' requires a primary key to be defined. at Microsoft.EntityFrameworkCo

我把我的模型放在一个有核心的类库中。我已经做了第一次迁移来测试我的模型的一部分,但是在一次大的增强之后,我删除了我的数据库和迁移,只进行了一次V1迁移

问题是,在这次删除之后,当我尝试添加迁移时,会出现以下错误:

System.InvalidOperationException: The entity type 'CustomAttributeData' requires a primary key to be defined.
   at Microsoft.EntityFrameworkCore.Internal.ModelValidator.ShowError(String message)
   at Microsoft.EntityFrameworkCore.Internal.ModelValidator.Validate(IModel model)
   at Microsoft.EntityFrameworkCore.Internal.RelationalModelValidator.Validate(IModel model)
   at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel(DbContext context, IConventionSetBuilder conventionSetBuilder, IModelValidator validator)
   at System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory)
   at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
   at Microsoft.EntityFrameworkCore.Internal.LazyRef`1.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_0`1.<Execute>b__0()
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
The entity type 'CustomAttributeData' requires a primary key to be defined.

谢谢。

在我的一个模型上,我有一个这样的属性:

public Type AvailableFor { get; set; } 
类型是一个对象,因此它正在等待主键,我将其更改为:

public string AvailableFor { get; set; } 
以及它的作品


感谢@H.Herzi:)

为了减少EF核心代码的拼写错误,您可以使用代码生成器工具,EF核心有一个用于代码生成的命令行工具,在我的例子中,我使用CatFactory,通过这样的代码,我们可以从现有数据库生成代码:

var connectionString = "server=(local);database=Store;integrated security=yes;";

var dbFactory = new SqlServerDatabaseFactory()
{
    ConnectionString = connectionString
};

var db = dbFactory.Import();

var project = new EfCoreProject()
{
    Name = "Store",
    Database = db,
    OutputDirectory = "C:\\Temp\\Store"
};

project.BuildFeatures();

project
    .GenerateEntities()
    .GenerateAppSettings()
    .GenerateMappingDependences()
    .GenerateMappings()
    .GenerateDbContext()
    .GenerateContracts()
    .GenerateRepositories();
您可以通过此链接获得更多信息:


这样,我们就避免了在编写EF核心代码时出错。实际上,我想在我的模型中使用类型,并且我已经用转换器初始化了属性:

modelBuilder.Entity<...>()
    .Property(x => x.Type)
    .IsRequired()
    .HasConversion(
        convertToProviderExpression: x => x.AssemblyQualifiedName,
        convertFromProviderExpression: x => Type.GetType(x));
modelBuilder.Entity()
.Property(x=>x.Type)
.IsRequired()
.哈斯转换(
convertToProviderExpression:x=>x.AssemblyQualifiedName,
convertFromProviderExpression:x=>Type.GetType(x));
我认为这足以让Entity Framework Core意识到类型不是实体,但我最终不得不显式忽略它,这样才能工作:

modelBuilder.Ignore<Type>();
modelBuilder.Ignore();

似乎您没有为所有实体定义密钥,您需要为db上下文中的每个实体设置密钥。我将重新检查,但我想我没有忘记任何主键或外键。我理解我的错误,我尝试对我的属性中的一个使用类型,它要求主键……这里也有同样的问题。错误是正确的,但是否有关于哪个实体受影响的提示请…这在没有Ignore语句(.NET Core 2.2)的情况下对我有效
modelBuilder.Ignore<Type>();