在 EF Core 中添加迁移时出现“实体类型‘CustomAttributeData’需要定义主键”错误

Orc*_*usZ 2 c# ef-code-first entity-framework-core asp.net-core

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

问题是,在删除之后,当我尝试出现add-migration此错误时:

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.
Run Code Online (Sandbox Code Playgroud)

我不知道为什么我会收到此错误。我所有的模型都有一个用DataAnnotation.

如果需要,我可以提供新型号。

这是相关/有用的上下文:

public class AmcContext : DbContext
{
    public DbSet<User> Users { get; set; }
    public DbSet<Location> Location { get; set; }
    public DbSet<Rating> Rating { get; set; }
    public DbSet<RatingType> RatingType { get; set; }
    public DbSet<Subscription> Subscription { get; set; }
    public DbSet<Module> Module { get; set; }

    public AmcContext(): base()
    {

    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Ignore<User>();
        modelBuilder.Entity<Client>().ToTable("Client");
        modelBuilder.Entity<Professionnal>().ToTable("Professional");

        base.OnModelCreating(modelBuilder);
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseSqlServer(@"Server=localhost\SQLEXPRESS;Database=Askmycar;Trusted_Connection=True;");

        base.OnConfiguring(optionsBuilder);
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢。

Orc*_*usZ 8

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

public Type AvailableFor { get; set; } 
Run Code Online (Sandbox Code Playgroud)

Type 是一个对象,因此它正在等待主键,我将其更改为:

public string AvailableFor { get; set; } 
Run Code Online (Sandbox Code Playgroud)

及其作品。

感谢@H.Herzi :)


Viv*_*lin 6

我实际上想在我的模型中使用Type,并且我已经使用转换器初始化了属性:

modelBuilder.Entity<...>()
    .Property(x => x.Type)
    .IsRequired()
    .HasConversion(
        convertToProviderExpression: x => x.AssemblyQualifiedName,
        convertFromProviderExpression: x => Type.GetType(x));
Run Code Online (Sandbox Code Playgroud)

我认为这足以让 Entity Framework Core 意识到 Type 不是一个实体,但我最终不得不明确忽略它才能工作:

modelBuilder.Ignore<Type>();
Run Code Online (Sandbox Code Playgroud)