web-dev-qa-db-ja.com

エンティティタイプには主キーを定義する必要があります

現在、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; }
    }
}

なぜこの奇妙なエラーが発生するのか誰にも手がかりがありますか?そして、まったく同じことを行う他のすべてのコントローラーが正常に機能するのはなぜですか?

11
Buzzet

Entity Frameworkは convention を使用します。つまり、Idという名前のプロパティを持つオブジェクトがある場合、そのオブジェクトの主キーであると想定されます。それがLoginItemclassがうまく機能する理由です。

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

    // ...
}
30
krillgar

作業中のLoginItemには次のものがあります。

public long Id { get; set; }

*idと呼ばれるプロパティが検出され、慣例により主キーとして使用されます。それ以外の場合は、[Key]属性を明示的に設定する必要があります。

5
j4nw

UserItemをDBContext、DBContextに登録するため、このユーザーアイテムをSQLデータベーステーブルにバインドし、UserItemで主キー属性を設定する必要があります。これを試してください、それはあなたの問題を解決します。

[Key] 
public int matrikelnr { get; set; }
1

これを解決する方法は複数ありました。

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. matrikelnrmatrikelnrIdの名前を変更します。 *IdEFPKと見なします。

 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 = "";
    }
}
1