Я пытаюсь следовать некоторому руководству по Entity Framework Core. В этом руководстве используется подход, основанный на коде, при создании базы данных. Когда я пытаюсь запустить первую миграцию, эта ошибка показывает:
Для типа объекта «Значение» требуется определить первичный ключ.
Точное сообщение выглядит следующим образом:
System.InvalidOperationException: тип сущности 'Value' требует
первичный ключ, который будет определен. в
Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys (IModel
модель) в
Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate (IModel
модель) в
Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate (IModel
модель) в
Microsoft.EntityFrameworkCore.Internal.SqliteModelValidator.Validate (IModel
модель) в
Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel (DbContext
контекст, IConventionSetBuilder ConventionSetBuilder, IModelValidator
валидатор) в
Microsoft.EntityFrameworkCore.Infrastructure.ModelSource. <> C__DisplayClass5_0.b__1 ()
в System.Lazy 1.ViaFactory(LazyThreadSafetyMode mode) at
System.Lazy
1.ExecutionAndPublication (LazyHelper
executeAndPublication, логическое значение useDefaultConstructor) в
System.Lazy 1.CreateValue() at
Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext
context, IConventionSetBuilder conventionSetBuilder, IModelValidator
validator) at
Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
at
Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()<br>
at
Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_1(IServiceProvider
p) at
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite
factoryCallSite, ServiceProviderEngineScope scope) at
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite (IServiceCallSite
callSite, аргумент TArgument) в
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite
scopedCallSite, область действия ServiceProviderEngineScope) в
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite
callSite, TArgument argument) at
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite
constructorCallSite, ServiceProviderEngineScope scope) at
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite (IServiceCallSite
callSite, аргумент TArgument) в
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite
scopedCallSite, область действия ServiceProviderEngineScope) в
Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite
callSite, TArgument argument) at
Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope
scope) at
Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type
serviceType, ServiceProviderEngineScope serviceProviderEngineScope)<br>
at
Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type
serviceType) at
Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider
provider, Type serviceType) at
Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider
provider) at
Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()<br>
at
Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at
Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at
Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure
1
Accessor) в
Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService] (IInfrastructure 1
accessor) at
Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func
1
завод) в
Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext (String
contextType) в
Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration (String
name, String outputDir, String contextType) в
Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl (String
name, String outputDir, String contextType) в
Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration. <> C__DisplayClass0_1. <. Т е р> b__0 ()
в
Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase. <> C__DisplayClass3_0`1.b__0 ()
в
Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (Action
действие) Тип сущности «Значение» требует определения первичного ключа.
(кто-то может отредактировать это сообщение, потому что оно выглядит ужасно, и я не могу это исправить?)
Я дважды проверил, есть ли у меня свойство Id в классе Value , и я добавил [Key] к нему, просто чтобы быть уверенным.
Я также перезапустил свой ноутбук, так как это может быть связано с экземпляром сервера, запущенного во время предыдущих сеансов тестирования, или чем-то вроде этого.
Класс моей модели:
using System.ComponentModel.DataAnnotations;
namespace DatingApp.API.Models
{
public class Value
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
}
DbContext:
using DatingApp.API.Models;
using Microsoft.EntityFrameworkCore;
namespace DatingApp.API.Data
{
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options) : base (options) {}
public DbSet<Value> Values {get; set;}
}
}
Startup.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using DatingApp.API.Data;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.HttpsPolicy;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
namespace DatingApp.API
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<DataContext>(c => c.UseSqlite(Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
// app.UseHsts();
}
// app.UseHttpsRedirection();
app.UseMvc();
}
}
}
И строка подключения:
{
"ConnectionStrings":
{
"DefaultConnection": "Data Source=DatingApp.db"
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
То, что я написал в терминале:
dotnet ef migrations add InitialMigration
РЕДАКТИРОВАТЬ:
D:\DatingApp\DatingApp.API>dotnet ef migrations add InitialMigration -v
Using project 'D:\DatingApp\DatingApp.API\DatingApp.API.csproj'.
Using startup project 'D:\DatingApp\DatingApp.API\DatingApp.API.csproj'.
Writing 'D:\DatingApp\DatingApp.API\obj\DatingApp.API.csproj.EntityFrameworkCore.targets'...
dotnet msbuild /target:GetEFProjectMetadata /property:EFProjectMetadataFile=C:\Users\B590\AppData\Local\Temp\tmp24D5.tmp
/ многословие: тихий / нолого
D: \ DatingApp \ DatingApp.API \ DatingApp.API.csproj
Запись «D: \ DatingApp \ DatingApp.API \ obj \ DatingApp.API.csproj.EntityFrameworkCore.targets» ...
dotnet msbuild / target: GetEFProjectMetadata /property:EFProjectMetadataFile=C:\Users\B590\AppData\Local\Temp\tmp2B8C.tmp
/ многословие: тихий / нолого
D: \ DatingApp \ DatingApp.API \ DatingApp.API.csproj
DotNet build D: \ DatingApp \ DatingApp.API \ DatingApp.API.csproj / многословие: quiet / nologo
Compilation succesfull.
Warnings: 0
Errors: 0
Time passed: 00:00:02.25
dotnet exec --depsfile D:\DatingApp\DatingApp.API\bin\Debug\netcoreapp2.1\DatingApp.API.deps.json
- дополнительный путь доступа C: \ Users \ B590.nuget \ packages - дополнительный путь доступа "C: \ Program Files \ dotnet \ sdk \ NuGetFallbackFolder" --runtimeconfig
D: \ DatingApp \ DatingApp.API \ Bin \ Debug \ netcoreapp2.1 \ DatingApp.API.runtimeconfig.json
«C: \ Program
Файлы \ DotNet \ SDK \ 2.1.403 \ DotnetTools \ DotNet-эф \ 2.1.4 \ инструменты \ netcoreapp2.1 \ любые \ инструменты \ netcoreapp2.0 \ любой \ ef.dll»
миграции добавить InitialMigration - сборка
D: \ DatingApp \ DatingApp.API \ Bin \ Debug \ netcoreapp2.1 \ DatingApp.API.dll
--startup-сборка D: \ DatingApp \ DatingApp.API \ bin \ Debug \ netcoreapp2.1 \ DatingApp.API.dll
--project-dir D: \ DatingApp \ DatingApp.API \ --language C # --working-dir D: \ DatingApp \ DatingApp.API --verbose --root-namespace DatingApp.API
Используя сборку 'DatingApp.API'.
Используя автозагрузку сборки 'DatingApp.API'.
Используя базу приложения «D: \ DatingApp \ DatingApp.API \ bin \ Debug \ netcoreapp2.1».
Используя рабочий каталог 'D: \ DatingApp \ DatingApp.API'.
Использование корневого пространства имен «DatingApp.API».
Используя каталог проекта 'D: \ DatingApp \ DatingApp.API \'.
Поиск классов DbContext ...
Поиск реализаций IDesignTimeDbContextFactory ...
Поиск поставщика услуг приложения ...
Поиск IWebHost доступа ...
Использование среды «Развитие».
Использование поставщика услуг приложения из средства доступа IWebHost в «Программе».
Найден DbContext 'DataContext'.
Поиск классов DbContext в проекте ...
Использование контекста «DataContext».
System.InvalidOperationException: тип сущности 'Value' требует определения первичного ключа.
в Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.ValidateNonNullPrimaryKeys (IModel
модель)
в Microsoft.EntityFrameworkCore.Infrastructure.ModelValidator.Validate (IModel
модель)
в Microsoft.EntityFrameworkCore.Infrastructure.RelationalModelValidator.Validate (IModel
модель)
в Microsoft.EntityFrameworkCore.Internal.SqliteModelValidator.Validate (IModel
модель)
в Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.CreateModel (DbContext
контекст, IConventionSetBuilder ConventionSetBuilder, IModelValidator
валидатор)
в Microsoft.EntityFrameworkCore.Infrastructure.ModelSource. <> c__DisplayClass5_0.b__1 ()
в System.Lazy 1.ViaFactory(LazyThreadSafetyMode mode)
at System.Lazy
1.ExecutionAndPublication (LazyHelper executeAndPublication, логическое значение useDefaultConstructor)
at System.Lazy 1.CreateValue()
at Microsoft.EntityFrameworkCore.Infrastructure.ModelSource.GetModel(DbContext
context, IConventionSetBuilder conventionSetBuilder, IModelValidator
validator)
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.CreateModel()
at Microsoft.EntityFrameworkCore.Internal.DbContextServices.get_Model()
at Microsoft.EntityFrameworkCore.Infrastructure.EntityFrameworkServicesBuilder.<>c.<TryAddCoreServices>b__7_1(IServiceProvider
p)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitFactory(FactoryCallSite
factoryCallSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite (IServiceCallSite
callSite, аргумент TArgument)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite
scopedCallSite, область действия ServiceProviderEngineScope)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite
callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitConstructor(ConstructorCallSite
constructorCallSite, ServiceProviderEngineScope scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor
2.VisitCallSite (IServiceCallSite
callSite, аргумент TArgument)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteRuntimeResolver.VisitScoped (ScopedCallSite
scopedCallSite, область действия ServiceProviderEngineScope)
в Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteVisitor 2.VisitCallSite(IServiceCallSite
callSite, TArgument argument)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.DynamicServiceProviderEngine.<>c__DisplayClass1_0.<RealizeService>b__0(ServiceProviderEngineScope
scope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.GetService(Type
serviceType, ServiceProviderEngineScope serviceProviderEngineScope)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngineScope.GetService(Type
serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider
provider, Type serviceType)
at Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService[T](IServiceProvider
provider)
at Microsoft.EntityFrameworkCore.DbContext.get_DbContextDependencies()
at Microsoft.EntityFrameworkCore.DbContext.get_InternalServiceProvider()
at Microsoft.EntityFrameworkCore.DbContext.Microsoft.EntityFrameworkCore.Infrastructure.IInfrastructure<System.IServiceProvider>.get_Instance()
at Microsoft.EntityFrameworkCore.Internal.InternalAccessorExtensions.GetService[TService](IInfrastructure
1
сбруя)
в Microsoft.EntityFrameworkCore.Infrastructure.AccessorExtensions.GetService [TService] (IInfrastructure 1
accessor)
at Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext(Func
1
завод)
в Microsoft.EntityFrameworkCore.Design.Internal.DbContextOperations.CreateContext (String
contextType)
в Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.AddMigration (String
имя, строка
outputDir, String contextType)
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigrationImpl (String
name, String outputDir, String contextType)
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.AddMigration. <> c__DisplayClass0_1. <. ctor> b__0 ()
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase. <> c__DisplayClass3_0`1.b__0 ()
в Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute (Action
действие)
Тип сущности «Значение» требует определения первичного ключа.