簡體   English   中英

在EF Core中添加遷移時,“實體類型'CustomAttributeData'需要定義主鍵”錯誤

[英]“The entity type 'CustomAttributeData' requires a primary key to be defined” error when I add-migration in EF 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.

我不知道為什么會收到此錯誤。 我所有的模型都有一個用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);
    }
}

謝謝。

在我的一個模型中,我有一個類似的屬性:

public Type AvailableFor { get; set; } 

類型是一個對象,因此它正在等待主鍵,所以我將其更改為:

public string AvailableFor { get; set; } 

及其作品。

感謝@ H.Herzi :)

為了減少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();

您可以在此鏈接上獲得更多信息: 使用CatFactory為EF Core生成代碼

這樣,我們避免在編寫EF Core代碼時犯錯誤

我實際上想在模型中使用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>();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM