Buz*_*zet 11 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 = "";
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的工作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 = "";
}
}
}
Run Code Online (Sandbox Code Playgroud)
如你所见,我设置了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
}
.
.
Run Code Online (Sandbox Code Playgroud)
好吧,因为它是在一个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; }
}
}
Run Code Online (Sandbox Code Playgroud)
有谁知道为什么我会得到这个奇怪的错误?为什么所有其他控制器工作正常,哪些完全相同?
kri*_*gar 30
实体框架按惯例进行.这意味着如果您有一个名为property的对象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; }
// ...
}
Run Code Online (Sandbox Code Playgroud)
有多种方法可以解决这个问题。
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 = "";
}
}
Run Code Online (Sandbox Code Playgroud)
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 = "";
}
}
Run Code Online (Sandbox Code Playgroud)
因为你向DBContext注册了UserItem,DBContext将此用户项与SQL数据库表绑定,需要在UserItem中设置任何主键属性。试试这个,它会解决你的问题。[关键] public int matrikelnr { get; 放; }
您的工作LoginItem有:
public long Id { get; set; }
Run Code Online (Sandbox Code Playgroud)
*id按照惯例,检测到被调用的属性并将其用作主键。[Key]否则,您需要显式设置属性。