2016-12-24 108 views
0

我有一个类库与核心,我把它放入我的模型。 我已经做了第一次迁移以测试我的模型的一部分,但经过大幅度增强后,我删除了我的数据库&迁移,只有一个V1迁移。当我添加移植EF核心奇怪的错误

的一件事情是,这个删除后,当我尝试添加迁移我有这样的错误:

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

    } 

谢谢。

+2

好像你没有为你的所有实体定义一个键,你需要为你的数据库环境中的每个实体设置键值 –

+0

我会重新检查,但我想我没有忘记任何主键或外键 – OrcusZ

+0

我明白我的错误,我试图使用类型为一个我的属性,它要求一个主键... – OrcusZ

回答

1

在我的模型之一,我有一个这样的特性:

public Type AvailableFor { get; set; } 

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

public string AvailableFor { get; set; } 

及其作品。

感谢@ H.Herzi :)

1

为了减少您的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(); 

你可以得到这个链接的详细信息:Generating Code for EF Core with CatFactory

这样,我们避免做出书面EF核心代码中的错误

+0

很高兴知道,感谢您的信息:) – OrcusZ