asp.net 实体类型需要定义主键

k2fxgqgv  于 2022-11-19  发布在  .NET
关注(0)|答案(4)|浏览(220)

我现在正在写一个ASP.NETWebAPI,对于两个控制器来说一切都很好。现在我尝试做和以前完全一样的事情,但是这次我得到了一个奇怪的错误:
系统操作无效异常:“实体类型'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 = "";
        }
    }
}

还有我的工作类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; }
    }
}

有没有人知道为什么我会出现这个奇怪的错误?为什么所有其他的控制器都能正常工作,而且做的完全一样?

kcugc4gi

kcugc4gi1#

Entity Framework使用convention。这意味着如果你有一个对象带有一个名为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; }

    // ...
}
iswrvxsc

iswrvxsc2#

您的工作LoginItem具有:

public long Id { get; set; }

会侦测到名为*id的属性,并依照惯例将其当做主索引键使用。否则您必须明确设定[Key]属性。

w41d8nur

w41d8nur3#

有多个是为了解决这个问题。
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.使用matrikelnrId重新命名matrikelnr。使用*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 = "";
    }
}
rbpvctlc

rbpvctlc4#

因为您向DBContext注册了UserItem,DBContext将此用户项与SQL数据库表绑定,通过该表需要设置UserItem中的任何主键属性。尝试此操作,它将解决您的问题。[Key] public int matrikelnr { get;设置; }

相关问题