实体类型需要定义主键

时间:2018-01-12 12:05:55

标签: c# asp.net asp.net-web-api

我现在正在编写一个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 = "";
        }
    }
}

我的工作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中的相同,它可以正常工作。

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

有谁知道为什么我会得到这个奇怪的错误?为什么所有其他控制器工作正常,哪些完全相同?

4 个答案:

答案 0 :(得分:20)

实体框架由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; }

    // ...
}

答案 1 :(得分:4)

您的工作LoginItem有:

public long Id { get; set; }

检测到名为*id的属性,并按惯例用作主键。您需要明确设置[Key]属性。

答案 2 :(得分:1)

因为您使用DBContext注册UserItem,DBContext将此用户项与SQL数据库绑定使用该表必须在UserItem中设置任何主键属性。 试试这个,它会解决你的问题。 [键] public int matrikelnr {get;组; }

答案 3 :(得分: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.使用matrikelnr重命名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 = "";
    }
}