web-dev-qa-db-fra.com

Le type d'entité nécessite la définition d'une clé primaire

J'écris en ce moment une API Web ASP.NET et tout fonctionne parfaitement pour 2 contrôleurs. Maintenant, j'essaie de faire exactement comme avant, mais cette fois, une erreur étrange se produit: 

System.InvalidOperationException: "Le type d'entité 'UserItem' nécessite la définition d'une clé primaire."

Alors, pourquoi UserItem a-t-il besoin d'une clé primaire alors que les autres n'en ont pas?

Ceci est ma classe 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 = "";
        }
    }
}

Et ma classe de TRAVAIL 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 = "";
         }
    }
}

Comme vous le voyez, je suis un getter et un setter, donc l'erreur ne peut pas être là.

Voici où l'erreur se produit:

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

Comme il s'agit d'un appel de contexte, je vais également attacher UserContext, mais c'est encore la même chose que dans LoginContext, qui fonctionne parfaitement.

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

Quelqu'un at-il une idée pourquoi je reçois cette erreur étrange? Et pourquoi tous les autres contrôleurs fonctionnent correctement et font exactement la même chose?

5
Buzzet

Entity Framework passe par convention . Cela signifie que si vous avez un objet avec une propriété nommée Id, cela supposera que c'est la clé primaire de l'objet. C'est pourquoi votre classe LoginItem fonctionne bien.

Votre classe UserItem ne possède pas cette propriété et par conséquent, elle ne sait pas quoi utiliser comme clé primaire.

Pour résoudre ce problème, fixez KeyAttribute à la clé de votre clé primaire. Par exemple:

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

    // ...
}
13
krillgar

Votre LoginItem de travail a:

public long Id { get; set; }

Les propriétés appelées *id sont détectées et utilisées comme clé primaire par convention. Sinon, vous devez définir explicitement l'attribut [Key].

4
j4nw

Attendez que vous enregistriez UserItem avec DBContext, DBContext Liez cet élément utilisateur à la base de données SQL Table avec laquelle il est nécessaire de définir tout attribut de clé primaire dans UserItem . Essayez ceci, cela résoudra votre problème . [Clé] public int matrikelnr {get; ensemble; }

1
Muhammad Imran khan

Il y a plusieurs était de résoudre cela.

1.Décorez matrikelnr en [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.Rename matrikelnr avec matrikelnrId. Avec *Id, EF le considérera comme 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 = "";
    }
}
1
Ehsan Ullah Nazir