【问题标题】:"The entity type 'CustomAttributeData' requires a primary key to be defined" error when I add-migration in EF Core当我在 EF Core 中添加迁移时出现“实体类型 'CustomAttributeData' 需要定义主键”错误
【发布时间】:2017-05-09 22:47:31
【问题描述】:

我将我的模型放入带有 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.

我不知道为什么会收到此错误。我所有的模型都有一个用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);
    }
}

谢谢。

【问题讨论】:

  • 您似乎没有为所有实体定义密钥,您需要为您的数据库上下文中的每个实体设置密钥
  • 我会重新检查,但我想我没有忘记任何主键或外键
  • 我理解我的错误,我尝试使用 Type 作为我的属性之一,它要求主键...

标签: c# asp.net-core ef-code-first entity-framework-core


【解决方案1】:

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

public Type AvailableFor { get; set; } 

类型是一个对象,所以它在等待一个主键我把它改成:

public string AvailableFor { get; set; } 

及其作品。

感谢@H.Herzi :)

【讨论】:

    【解决方案2】:

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

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

    我认为这足以让 Entity Framework Core 意识到 Type 不是实体,但我最终不得不明确地忽略它以使其正常工作:

    modelBuilder.Ignore<Type>();
    

    【讨论】:

    • 这里有同样的问题。错误是正确的,但是否可以提示哪个实体受到影响...
    • 这对我有用,没有 Ignore 语句(.NET Core 2.2)
    【解决方案3】:

    为了减少 EF Core 代码中的拼写错误,您可以使用代码生成器工具,EF Core 有一个用于代码生成的命令行工具,在我的例子中,我使用 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();
    

    您可以通过此链接获取更多信息:Generating Code for EF Core with CatFactory

    这样我们避免在编写 EF Core 代码时出错

    【讨论】:

      猜你喜欢
      • 2022-11-19
      • 1970-01-01
      • 2021-01-25
      • 2022-06-16
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多