2016-12-24 3 views
0

Ich habe eine Klassenbibliothek mit Kern und ich habe meine Modelle hinein. Ich habe bereits eine erste Migration durchgeführt, um einen Teil meines Modells zu testen, aber nach einer großen Verbesserung löschte ich meine Datenbank & Migration, um nur eine V1-Migration zu haben.Seltsame Fehler, wenn ich hinzufügen-Migration EF Core

Die Dinge, nach dieser Deletion, wenn ich versuche, Migration Add-ich habe diesen Fehler:

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. 

Ich weiß nicht, warum ich diesen Fehler habe, all mein Modell hat einen Primärschlüssel definiert mit DataAnnotation

ist benötigt ich die neuen Modelle bieten kann, aber ich fügen Sie den Kontext, wenn dem verwandt ist oder kann hilfreich sein:

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); 
     } 

    } 

Danke.

+2

Es scheint, als ob Sie keinen Schlüssel für alle Ihre Entitäten definiert haben, müssen Sie Schlüssel für jede Entität in Ihrem db-Kontext –

+0

Ich werde erneut überprüfen, aber ich glaube, ich habe keinen primären oder fremden Schlüssel vergessen – OrcusZ

+0

Ich verstehe meine Fehler, ich habe versucht, Typ für eine meine Eigenschaften zu verwenden und es um einen Primärschlüssel zu bitten ... – OrcusZ

Antwort

1

Auf einem meiner Modell habe ich eine Eigenschaft wie folgt aus:

public Type AvailableFor { get; set; } 

Typ ist ein Objekt, so dass es für einen Primärschlüssel wartete ich ändern es:

public string AvailableFor { get; set; } 

und seine Werke .

Dank @ H.Herzi :)

1

Um einen falsch geschriebenen Fehler auf Ihrem EF Core-Code zu reduzieren, können Sie ein Code-Generator-Tool verwenden können, muss EF-Core ein Kommandozeilen-Tool für die Codegenerierung, die ich in meinem Fall verwenden Sie CatFactory und mit Code wie diesen können wir Code aus vorhandenen Datenbank generieren:

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(); 

Sie können mehr Informationen über diesen Link erhalten: Generating Code for EF Core with CatFactory

auf diese Weise vermeiden wir einen Fehler machen beim Schreiben EF Core-Code

+0

Gut zu wissen, danke für die Informationen :) – OrcusZ