Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体类型需要定义主键_C#_Asp.net_Asp.net Web Api - Fatal编程技术网

C# 实体类型需要定义主键

C# 实体类型需要定义主键,c#,asp.net,asp.net-web-api,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

我现在正在编写一个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 = "";
        }
    }
}
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 = "";
         }
    }
}
以及我的工作
LoginItem
课程:

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 = "";
        }
    }
}
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
        }
        .
        .
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用System.Threading.Tasks;
使用Microsoft.AspNetCore.Mvc;
使用ModulApi.Models;
使用ModulApi.DBConnectors;
//有关为空项目启用Web API的更多信息,请访问
https://go.microsoft.com/fwlink/?LinkID=397860
命名空间ModulApi.Controllers
{
[路线(“api/用户”)]
公共类UserController:Controller
{
私有只读用户上下文\u上下文;
公共用户控制器(用户上下文)
{
_上下文=上下文;

如果(_context.UserItems.Count()==0)因为您向DBContext注册了UserItem,DBContext会将此用户项绑定到SQL数据库表中,在UserItem中设置任何主键属性都是必需的。 试试这个,它会解决你的问题

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

解决这个问题有多种方法

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 = "";
    }
}
< > > >重命名<代码> MatrKelnr > <代码> MyRelknRID。
 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 = "";
    }
}
实体框架。这意味着如果您有一个名为
Id
的属性的对象,它将假定它是该对象的主键。这就是
LoginItem
类工作正常的原因

您的
UserItem
类没有这样的属性,因此它无法确定使用什么作为主键

要解决此问题,请将附加到类上的主键。例如:

// 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]
属性否则。

EF将LoginItem成员Id设置为默认主键。由于UserItem中不存在成员Id或UserItemId,因此出现此错误可能是在数据库表中,您没有设置主键。谢谢,这很有效。但我还必须添加“using System.ComponentModel.DataAnnotations”正确。这就是为什么我链接了该属性,以便您可以看到它的所有内容,包括名称空间。但是,我也会将其添加到答案中。因此,这意味着您无法使用EF Core将结果从SP映射到DTO,而不为其定义主键?这不是有点奇怪吗?完整的框架EF可以在没有问题的情况下完成此映射ems(
ctx.Database.SqlQuery(“dbo.MySP{0}”,docId).FirstOrDefault();
)。@user2173353我很确定您需要EF 5.0(.NET Framework)中的PK还有。您共享的代码正在运行手动查询,而不是在问题所涉及的上下文中使用
DbSet
属性。对于这些查询,您可以将其投影到包含将从存储过程返回的属性的任何C#对象中。您仍然可以在EF Core中执行此操作。谢谢!我是stump在这一次,一切似乎都应该工作-原来我有我的新对象与字段,而不是属性。