簡體   English   中英

實體類型需要定義一個主鍵

[英]The entity type requires a primary key to be defined

我現在正在編寫一個 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 = "";
         }
    }
}

如您所見,我設置了 getter 和 setter,因此不會出現錯誤。

這是發生錯誤的地方:

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 中的相同,它工作得很好。

用戶上下文:

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

有沒有人知道為什么我會收到這個奇怪的錯誤? 為什么所有其他控制器都可以正常工作而完全相同?

實體框架按慣例行事 這意味着如果您有一個名為Id的屬性的對象,它將假定它是該對象的主鍵。 這就是您的LoginItem類工作正常的原因。

您的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]屬性。

因為你在DBContext中注冊了UserItem,DBContext將此用戶項與SQL數據庫表綁定,需要在UserItem中設置任何主鍵屬性。 試試這個,它會解決你的問題。

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

有多種方法可以解決這個問題。

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

matrikelnrmatrikelnrIdmatrikelnr matrikelnrId 使用*IdEF會將其視為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 = "";
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM