現在、ASP.NET Web APIを作成していますが、2つのコントローラーですべて正常に動作します。今、私は以前とまったく同じことをしようとしますが、今回は奇妙なエラーが発生します:
System.InvalidOperationException: "エンティティタイプ 'UserItem'には、プライマリキーを定義する必要があります。"
それでは、他の人が必要としないのに、なぜUserItem
には主キーが必要なのでしょうか?
これは私のUserItem
クラスです:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ModulApi.Models
{
public class UserItem
{
public int matrikelnr { get; set; }
public string studiengang { get; set; }
public string user_semester { get; set; }
public string user_max_klausur { get; set; }
//Not necessary Constructor. I try to fix the primary Key error.
public UserItem()
{
this.matrikelnr = 0;
this.studiengang = "";
this.user_max_klausur = "";
this.user_semester = "";
}
}
}
そして、私のWORKING LoginItem
クラス:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace ModulApi.Models
{
public class LoginItem
{
public long Id { get; set; }
public string username { get; set; }
public string password { get; set; }
public string matrikelnr { get; set; }
public string email { get; set; }
public string email_verified { get; set; }
public LoginItem()
{
this.Id = 0;
this.username = "";
this.password = "";
this.matrikelnr = "";
this.email = "";
this.email_verified = "";
}
}
}
ご覧のとおり、ゲッターとセッターを設定しているため、エラーは発生しません。
エラーが発生する場所は次のとおりです。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Mvc;
using ModulApi.Models;
using ModulApi.DBConnectors;
// For more information on enabling Web API for empty projects, visit
https://go.Microsoft.com/fwlink/?LinkID=397860
namespace ModulApi.Controllers
{
[Route("api/user")]
public class UserController : Controller
{
private readonly UserContext _context;
public UserController(UserContext context)
{
_context = context;
if (_context.UserItems.Count() == 0) <--- Error right here
{
getDataFromConnector(_context);
}
}
private void getDataFromConnector(UserContext context)
{
//Getting my Data from Database method
}
.
.
Context呼び出しにあるので、UserContextもアタッチしますが、LoginContextの場合と同じです。
UserContext:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
namespace ModulApi.Models
{
public class UserContext : DbContext
{
public UserContext(DbContextOptions<UserContext> options) : base(options)
{
}
public DbSet<UserItem> UserItems { get; set; }
}
}
なぜこの奇妙なエラーが発生するのか誰にも手がかりがありますか?そして、まったく同じことを行う他のすべてのコントローラーが正常に機能するのはなぜですか?
Entity Frameworkは convention を使用します。つまり、Id
という名前のプロパティを持つオブジェクトがある場合、そのオブジェクトの主キーであると想定されます。それがLoginItem
classがうまく機能する理由です。
UserItem
クラスにはそのようなプロパティがありません。そのため、主キーとして何を使用すればよいかわかりません。
これを修正するには、 KeyAttribute をクラスの主キーに付けます。例えば:
// Need to add the following using as well at the top of the file:
using System.ComponentModel.DataAnnotations;
public class UserItem
{
[Key]
public int matrikelnr { get; set; }
public string studiengang { get; set; }
public string user_semester { get; set; }
public string user_max_klausur { get; set; }
// ...
}
作業中のLoginItem
には次のものがあります。
public long Id { get; set; }
*id
と呼ばれるプロパティが検出され、慣例により主キーとして使用されます。それ以外の場合は、[Key]
属性を明示的に設定する必要があります。
UserItemをDBContext、DBContextに登録するため、このユーザーアイテムをSQLデータベーステーブルにバインドし、UserItemで主キー属性を設定する必要があります。これを試してください、それはあなたの問題を解決します。
[Key]
public int matrikelnr { get; set; }
これを解決する方法は複数ありました。
1. matrikelnr
を[Key]
public class UserItem
{
[Key]
public int matrikelnr { get; set; }
public string studiengang { get; set; }
public string user_semester { get; set; }
public string user_max_klausur { get; set; }
//Not necessary Constructor. I try to fix the primary Key error.
public UserItem()
{
this.matrikelnr = 0;
this.studiengang = "";
this.user_max_klausur = "";
this.user_semester = "";
}
}
2. matrikelnr
でmatrikelnrId
の名前を変更します。 *Id
、EF
はPK
と見なします。
public class UserItem
{
[Key]
public int matrikelnrId { get; set; }
public string studiengang { get; set; }
public string user_semester { get; set; }
public string user_max_klausur { get; set; }
//Not necessary Constructor. I try to fix the primary Key error.
public UserItem()
{
this.matrikelnrId = 0;
this.studiengang = "";
this.user_max_klausur = "";
this.user_semester = "";
}
}