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?
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; }
// ...
}
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]
.
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; }
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 = "";
}
}