

## 問題

[公式チュートリアル](https://docs.microsoft.com/ja-jp/aspnet/core/tutorials/first-mvc-
app/adding-model?view=aspnetcore-5.0&tabs=visual-studio-mac)
通りにサンプルアプリ（MvcMovie）を作成しており、  
以下コマンド時に表題のエラーが表示されます。

[code]

    dotnet-aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqlite
    
[/code]

#### エラー詳細

[code]

    Building project ...
    Finding the generator 'controller'...
    Running the generator 'controller'...
    Generating a new DbContext class 'MvcMovieContext'
    Attempting to compile the application in memory with the added DbContext.
    Attempting to figure out the EntityFramework metadata for the model and DbContext: 'Movie'
    The entity type 'Movie' requires a primary key to be defined. If you intended to use a keyless entity type, call 'HasNoKey' in 'OnModelCreating'. For more information on keyless entity types, see https://go.microsoft.com/fwlink/?linkid=2141943. StackTrace:
    
[/code]

## 試したこと①

**「Id」の上に`[Key]`をつけてからスキャフォールディングコマンド**  
→解消されず、表題と同じエラーが表示される

そもそも「Id」がある場合、それをPrimaryKeyとして自動で判定する為、  
「The entity type ‘X’ requires a primary key to be defined」  
のエラーは出ないはずでは？

・Models/Movie.cs

[code]

    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace MvcMovie.Models
    {
        public class Movie
        {
            [Key]
            public int Id { get; set; }
            public string Title { get; set; }
            public string Genre { get; set; }
            public decimal Price { get; set; }
    
            [DataType(DataType.Date)]
            public DateTime ReleaseDate { get; set; }
        }
    }
    
[/code]

## 試したこと②

**「OnModelCreating」で「HasNoKey」を呼び出してからスキャフォールディングコマンド**  
→解消されず、表題と同じエラーが表示される

エラー内容には「OnModelCreating」で「HasNoKey」を呼び出しすべき。という記載がありますが、  
呼び出すのは「MvcMovieContext」という認識で良いでしょうか？

しかし、「MvcMovieContext」はスキャフォールディング成功時に作成されるクラスであることが矛盾しています。

コントローラーフォルダの右クリックメニューからスキャフォールディングする場合も「使用するDBContext
Class」が必須であることから、スキャフォールディングを実行する前に「MvcMovieContext」を作成する必要があるのではないかと考えています。  
[![新しいスキャフォールディングの追加](https://i.stack.imgur.com/lRJ8A.png)](https://i.stack.imgur.com/lRJ8A.png)

また参考にしたサイトもスキャフォールディングコマンドの前に「MvcMovieContext」を自作していました。  
参考：[ASP.NET Core 5.0
MVCのチュートリアルを丁寧にやってみた②（モデルの追加とDBの作成）](https://hirahira.blog/asp-net-core5-mvc-
tutorial-02/)  
※他にも多くのサイトがContextクラスを自作しているのが見受けられました。

しかし、先に「MvcMovieContext」を作成したとしても問題は解決されず、  
表題のエラーが表示されました。

・Data/MvcMovieContext

[code]

    using Microsoft.EntityFrameworkCore;
    using MvcMovie.Models;
    
    namespace MvcMovie.Data
    {
        public class MvcMovieContext : DbContext
        {
            public MvcMovieContext(DbContextOptions<MvcMovieContext> options)
                : base(options)
            {
            }
            public DbSet<Movie> Movie { get; set; }
    
            protected override void OnModelCreating(ModelBuilder modelBuilder)
            {
                modelBuilder.Entity<Movie().HasKey(m => new { m.Id });
            }
        }
    }
    
[/code]

## バージョン情報

dotnet —info

[code]

    .NET SDK (global.json を反映):
     Version:   5.0.401
     Commit:    4bef5f3dbf
    
    ランタイム環境:
     OS Name:     Mac OS X
     OS Version:  11.0
     OS Platform: Darwin
     RID:         osx.11.0-x64
     Base Path:   /usr/local/share/dotnet/sdk/5.0.401/
    
    Host (useful for support):
      Version: 5.0.10
      Commit:  e1825b4928
    
    .NET SDKs installed:
      3.1.412 [/usr/local/share/dotnet/sdk]
      3.1.413 [/usr/local/share/dotnet/sdk]
      5.0.400 [/usr/local/share/dotnet/sdk]
      5.0.401 [/usr/local/share/dotnet/sdk]
    
    .NET runtimes installed:
      Microsoft.AspNetCore.App 3.1.18 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 3.1.19 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 5.0.9 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
      Microsoft.AspNetCore.App 5.0.10 [/usr/local/share/dotnet/shared/Microsoft.AspNetCore.App]
      Microsoft.NETCore.App 3.1.18 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
      Microsoft.NETCore.App 3.1.19 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
      Microsoft.NETCore.App 5.0.9 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
      Microsoft.NETCore.App 5.0.10 [/usr/local/share/dotnet/shared/Microsoft.NETCore.App]
    
[/code]


CC BY-SA 4.0
2021-10-07T02:52:27.113
82931
2021-10-20T11:10:59.587
2021-10-20T11:10:59.587
3060
48528
question
c# macos visual-studio asp.net-core
MacOS でエラー The entity type ‘X’ requires a primary key to be defined


Solved by the following method. Thanks!

・MvcMovie.Models

[code]

       {
            public class Movie
            {
                public int Id { get; set; }
                public string Title { get; set; }
                public string Genre { get; set; }
                [Column(TypeName = "decimal(5, 2)")] //Add
                public decimal Price { get; set; }
        
                [DataType(DataType.Date)]
                public DateTime ReleaseDate { get; set; }
            }
        }
    
[/code]


CC BY-SA 4.0
2021-10-07T07:56:06.370
82934
2021-10-07T07:56:06.370
48528
82931
answer