私がEFコアを追加すると奇妙なエラーが発生する

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

質問

私はコアを持つクラスライブラリを持っており、私はそれに私のモデルを入れました。モデルの一部をテストするための最初の移行はすでに行っていましたが、大幅な拡張の後、データベースと移行を削除してV1移行を1つだけにしました。

問題は、この削除後に、私が追加マイグレーションしようとすると、私はこのエラーがあります:

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

    }

ありがとう。

受け入れられた回答

私のモデルの1つでは、次のようなプロパティがあります。

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コア用のコードの生成を参照してください。

このようにして、EF Coreコードを記述する際に間違いを避ける



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ