前提・実現したいこと
環境:VisualStudio for Mac
言語:C#
実現したいこと:MySQLの内容をWebページに表示したい
以下記事参考に作成しています。
・macOS環境でASP.NET COREのWEBアプリをMySQLに接続した
・MacでASP.NET Core + EntityFramework Core + MySQL な開発を行う方法
・【C#】ASP.NET CoreでMySQLを利用する(MySQL接続設定編)②
エラーを元に引き続き自分でも調べていきますが、
解決方法がわかる方いたらご教示いただけると幸いです。
宜しくお願いいたします。
発生している問題・エラーメッセージ
UserList.cshtml
(MySqlの内容をを表示したいページ)にて以下エラー
error
1Error CS1579: foreach statement cannot operate on variables of type 'User' because 'User' does not contain a public instance or extension definition for 'GetEnumerator' (CS1579)
プロジェクト作成手順と該当のソースコード
1: NET Core > アプリ > ASP.NET Core Web App (MVC) で「PassManager」プロジェクト新規作成
2: NuGet パッケージのインストール(補足情報参照)
3: Modelsフォルダの中にUser.csを作成
User
1namespace PassManager.Models 2{ 3 public class User 4 { 5 public int Id { get; set; } 6 public string Userid { get; set; } 7 public string Name { get; set; } 8 } 9}
4: Modelsフォルダの中にUserContext.csを作成
UserContext
1namespace PassManager.Data 2{ 3 public class UserContext : DbContext 4 { 5 6 public UserContext(DbContextOptions options) : base(options) 7 { 8 } 9 10 public DbSet<User> Users { get; set; } 11 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 12 { 13 optionsBuilder.UseMySql( 14 "server=localhost;user=username;password=pass;database=pass_manager;", 15 new MySqlServerVersion(new Version(8, 0, 11)) 16 ); 17 } 18 } 19}
5: appsettings.json に以下コード追加
app
1 "ConnectionStrings": { //追加 2 "DefaultConnection": "server=localhost;userid=username;database=pass_manager;" 3 },
6: Startup.cs のpublic void ConfigureServices
内を以下に変更
Startup
1public void ConfigureServices(IServiceCollection services) 2 { 3 services.AddControllersWithViews(); 4 services.AddMvc(); 5 services.AddDbContext<UserContext>(options 6 => options.UseMySql(ConfigurationSection("DefaultConnection"))); 7 } 8 //↑DefaultConnectionエラー回避の為のメソッド 9 private ServerVersion ConfigurationSection(object defaultConnection) 10 { 11 throw new NotImplementedException(); 12 }
※参考にしたページでは以下のコードでしたが、エラーが出たので上記の方法でエラー回避しています。
options.UseMySql(Configuration.GetConnectionString("DefaultConnection")));
7: データベースの確認
作成済みであることを確認します
・内容
・構造
8: Controllersフォルダの中にUsersController.cs を作成
UsersController
1namespace PassManager.Controllers 2{ 3 public class UsersController : Controller 4 { 5 public IActionResult UserList() 6 { 7 return View(); 8 } 9 } 10}
9: Views>Homeフォルダの中のUserList.cshtml を修正
UserList
1@model IEnumerable<PassManager.Models.User> 2 3<html lang="ja"> 4<head> 5 <meta name="google-signin-scope" content="profile email"> 6 <meta name="google-signin-client_id" content="123abc.apps.googleusercontent.com"> 7 <script src="https://apis.google.com/js/platform.js" async defer></script> 8</head> 9<body> 10 <h1>@ViewData["Title"]</h1> 11 12 @*ログアウトボタンタップ時の挙動*@ 13 <script>function signOut() { 14 var auth2 = gapi.auth2.getAuthInstance(); 15 auth2.signOut().then(function () { 16 console.log('User signed out.'); 17 }); 18} 19 20 @* ログイン画面と別ページにログアウトボタンがある場合はgapi.auth2ライブラリを手動でロードして初期化する必要がある *@ 21 function onLoad() { 22 gapi.load('auth2', function () { 23 gapi.auth2.init(); 24 }); 25 }</script> 26 27 @*ロクアウトボタンタップ時にHOME画面に戻る*@ 28 <a href="https://localhost:5001/Home" onclick="signOut();">Sign out</a> 29 <script src="https://apis.google.com/js/platform.js?onload=onLoad" async defer></script> 30 31 <p> 32 <a asp-action="Create">Create New</a> 33 </p> 34 35 <table class="table"> 36 <thead> 37 <tr> 38 <th> 39 @Html.DisplayNameFor(model => model.Id) 40 </th> 41 <th> 42 @Html.DisplayNameFor(model => model.Userid) 43 </th> 44 <th> 45 @Html.DisplayNameFor(model => model.Name) 46 </th> 47 <th></th> 48 </tr> 49 </thead> 50 <tbody> 51 @foreach (var item in Model) ///////////// ここでエラー ///////////// 52 { 53 <tr> 54 <td> 55 @item.Id 56 </td> 57 <td> 58 @item.Userid 59 </td> 60 <td> 61 @item.Name 62 </td> 63 <td> 64 <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> | 65 <a asp-action="Details" asp-route-id="@item.Id">Details</a> | 66 <a asp-action="Delete" asp-route-id="@item.Id">Delete</a> 67 </td> 68 </tr> 69 } 70 </tbody> 71 </table> 72</body> 73</html>
試したこと①
stackoverflow参考に修正
参考:foreach (var item in Model), Object reference not set to an instance of an objec
・UsersController.csの修正
UsersController
1namespace PassManager.Controllers 2{ 3 public class UsersController : Controller 4 { 5 public ActionResult MyUserList()//このメソッドの中を入れ替えた 6 { 7 User obj = new() 8 { 9 MyUserList = new List<User>()// Load your list using uery 10 }; 11 return View(obj); 12 } 13 } 14}
・Users.csの修正
Users
1using System; 2using System.Collections.Generic; 3 4namespace PassManager.Models 5{ 6 public partial class User 7 { 8 public int Id { get; set; } 9 public string Userid { get; set; } 10 public string Name { get; set; } 11 public List<User> MyUserList { get; set; } //追加した 12 } 13}
・UsersList.cshtmlの修正
Model
からModel.MyUserList
へ変更
UsersList
1@foreach (var item in Model.MyUserList)
ビルド成功するが、ページ表示時に以下エラー
error
1An unhandled exception occurred while processing the request. 2 3NullReferenceException: Object reference not set to an instance of an object. 4AspNetCore.Views_Home_UserList.<ExecuteAsync>b__13_1() in UserList.cshtml, line 54
試したこと②
公式ドキュメントを参考にMvcMovieアプリを作成するが以下コマンド時にエラー
dotnet-aspnet-codegenerator controller -name MoviesController -m Movie -dc MvcMovieContext --relativeFolderPath Controllers --useDefaultLayout --referenceScriptLibraries -sqlite
error1
1warning MSB3026: "obj/Debug/netcoreapp3.1/MvcMovie.pdb" を "bin/Debug/netcoreapp3.1/MvcMovie.pdb" にコピーできませんでした。1000 ミリ秒以内に 1 回目の再試行を開始します。The process cannot access the file '/Users/lcr038/Desktop/MvcMovie/MvcMovie/bin/Debug/netcoreapp3.1/MvcMovie.pdb' because it is being used by another process. [/Users/lcr038/Desktop/MvcMovie/MvcMovie/MvcMovie.csproj]
error2
1/usr/local/share/dotnet/sdk/5.0.401/Microsoft.Common.CurrentVersion.targets(4569,5): error MSB3021: ファイル "obj/Debug/netcoreapp3.1/MvcMovie.pdb" を "bin/Debug/netcoreapp3.1/MvcMovie.pdb" にコピーできません。The process cannot access the file '/Users/lcr038/Desktop/MvcMovie/MvcMovie/bin/Debug/netcoreapp3.1/MvcMovie.pdb' because it is being used by another process. [/Users/lcr038/Desktop/MvcMovie/MvcMovie/MvcMovie.csproj]
補足情報(FW/ツールのバージョンなど)
■ ツールバージョン
version
1=== Visual Studio Community 2019 for Mac === 2Version 8.10.9 (build 3) 3 GTK+ 2.24.23 (Raleigh theme) 4 Xamarin.Mac 6.18.0.23 (d16-6 / 088c73638) 5 Package version: 612000140 6 7=== Mono Framework MDK === 8Runtime: 9 Mono 6.12.0.140 (2020-02/51d876a041e) (64-bit) 10 Package version: 612000140 11 12=== Roslyn (Language Service) === 133.10.0-4.21269.26+029847714208ebe49668667c60ea5b0a294e0fcb 14 15=== NuGet === 16バージョン: 5.9.0.7134 17 18=== .NET Core SDK === 19SDK バージョン: 20 5.0.401 21 5.0.400 22 3.1.413 23 3.1.412 24 25=== .NET Core ランタイム === 26ランタイム: /usr/local/share/dotnet/dotnet 27ランタイム バージョン: 28 5.0.10 29 5.0.9 30 3.1.19 31 3.1.18 32 33=== .NET Core 3.1 SDK === 34SDK: 3.1.413 35 36=== Xamarin.Profiler === 37バージョン: 1.6.15.68 38 39=== Updater === 40バージョン: 11 41 42=== Apple Developer Tools === 43Xcode 13.0 (19234) 44 45=== Xamarin.Mac === 46Version: 7.14.0.24 (Visual Studio Community) 47 48=== Xamarin.Android === 49バージョン: 11.3.0.4 (Visual Studio Community) 50SDK Tools のバージョン: 26.1.1 51SDK プラットフォーム ツールのバージョン: 30.0.4 52SDK ビルド ツールのバージョン: 30.0.2 53 54ビルド情報: 55Mono: b4a3858 56Java.Interop: xamarin/java.interop/d16-10@f39db25 57ProGuard: Guardsquare/proguard/v7.0.1@912d149 58SQLite: xamarin/sqlite/3.35.4@85460d3 59Xamarin.Android Tools: xamarin/xamarin-android-tools/d16-10@c5732a0 60 61=== Microsoft OpenJDK for Mobile === 62Java SDK: /Users/lcr038/Library/Developer/Xamarin/jdk/microsoft_dist_openjdk_1.8.0.25 631.8.0-25 64 65=== Android SDK Manager === 66Version: 16.10.0.13 67 68=== Android Device Manager === 69Version: 16.10.0.15 70 71=== Operating System === 72Mac OS X 10.16.0 73Darwin 20.6.0 Darwin Kernel Version 20.6.0
■ NuGet関連情報
・MySQL.Data.EntityFrameworkCore
では上手くいかないのでPomelo.EntityFrameworkCore.MySql
を使う
また、上記は共存不可。
■ DB確認ツール
Mac対応のSequel Aceというアプリを使っています
■ アプリの構造
HOME画面でGoogleログイン後、(ログイン画面のソースコードは省略)
UserList画面でpass_managerのテーブル内容が表示される想定です。
回答1件
あなたの回答
tips
プレビュー