Я использую веб-API Asp.net с EntityFramework и MSSQL для своего Backend. Для моего интерфейса я использую Angular версии 8.2.
Мои таблицы базы данных выглядят так:
User: {
UserID varchar(50)
Firstname varchar(50)
Lastname varchar (50)
}
Schoolclass: {
SchoolclassID number
Name varchar(50)
}
UserToSchoolclass: {
UserID varchar(50)
SchoolclassID number
primary key(UserID, SchoolclassID)
foreign key ... to User (short version)
foreign key ... to Schoolclass (short version)
}
Теперь у меня есть следующий вопрос: Как я могу создать запись UserToSchoolclass?
У меня нет ресурса UserToSchoolclass в моем веб-API, так как у меня есть пользователь и ресурс Schoolclass.
Пользовательский объект API выглядит так:
[ UserID: "A3453z839385", Firstname: "Benjamin", Lastname: "Ellmer", Schoolclass: [] ]
MyМетод обновления выглядит следующим образом:
export class Schoolclass {
SchoolclassID: number;
Name: string;
}
export class DBUser {
UserID: string;
Firstname: string;
Lastname: string;
Schoolclass: Schoolclass[];
}
httpOptions = {
headers: new HttpHeaders({
'Content-Type': 'application/json'
})
}
updateUser(userID, user): Observable<DBUser> {
return this.http.put<DBUser>(this.apiURL + '/Users/' + userID, JSON.stringify(user), this.httpOptions)
}
И когда я пытаюсь добавить Schoolclass, как это
schoolclass = {
SchoolclassID: 0,
Name: "5B"
}
const schoolclasses = this.user.Schoolclass;
schoolclasses.push(schoolclass);
const newUser = {
UserID: this.user.UserID,
Schoolclass: schoolclasses
}
updateUser(user.UserID, newUser).subscribe((data) => {
});
Когда я делаю это, я получаю следующую ошибку:
HttpErrorResponse {headers: HttpHeaders, status: 500, statusText: "Internal Server Error", url: "http://localhost:50000/api/Users/A3453z839385", ok: false, …}
error:
ExceptionMessage: "Fehler bei der Überprüfung einer oder mehrerer Entitäten. Weitere Informationen finden Sie in den Erläuterungen zur EntityValidationErrors-Eigenschaft."
ExceptionType: "System.Data.Entity.Validation.DbEntityValidationException"
Message: "Fehler"
StackTrace: " bei System.Data.Entity.Internal.InternalContext.SaveChanges()
↵ bei System.Data.Entity.Internal.LazyInternalContext.SaveChanges()
↵ bei System.Data.Entity.DbContext.SaveChanges()
↵ bei Server.Controllers.UsersController.PutUser(String id, User user) in C:\Users\benja\Desktop\TestProject\Backend\TestAPI\Server\Controllers\UsersController.cs:Zeile 58.
↵ bei lambda_method(Closure , Object , Object[] )
↵ bei System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.<>c__DisplayClass6_2.<GetExecutor>b__2(Object instance, Object[] methodParameters)
↵ bei System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ActionExecutor.Execute(Object instance, Object[] arguments)
↵ bei System.Web.Http.Controllers.ReflectedHttpActionDescriptor.ExecuteAsync(HttpControllerContext controllerContext, IDictionary`2 arguments, CancellationToken cancellationToken)
↵--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
↵ bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵ bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵ bei System.Web.Http.Controllers.ApiControllerActionInvoker.<InvokeActionAsyncCore>d__1.MoveNext()
↵--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
↵ bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵ bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵ bei System.Web.Http.Controllers.ActionFilterResult.<ExecuteAsync>d__5.MoveNext()
↵--- Ende der Stapelüberwachung vom vorhergehenden Ort, an dem die Ausnahme ausgelöst wurde ---
↵ bei System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
↵ bei System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
↵ bei System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()"
__proto__: Object
headers: HttpHeaders {normalizedNames: Map(0), lazyUpdate: null, lazyInit: ƒ}
message: "Http failure response for http://localhost:50000/api/Users/A3453z839385: 500 Internal Server Error"
name: "HttpErrorResponse"
ok: false
status: 500
statusText: "Internal Server Error"
url: "http://localhost:50000/api/Users/A3453z839385"
__proto__: HttpResponseBase
Это также не работает:
const newUser = {
UserID: this.user.UserID,
Firstname: this.user.Firstname,
Lastname: this.user.Lastname,
Schoolclass: schoolclasses
}
updateUser(user.UserID, newUser).subscribe((data) => {
});
Но это работает:
const newUser = {
UserID: this.user.UserID,
Firstname: this.user.Firstname,
Lastname: "New Lastname"
}
updateUser(user.UserID, newUser).subscribe((data) => {
});
Код моего UsersController выглядит автоматически генерируется Visual Studio и выглядит так:
namespace Server.Controllers
{
[EnableCors(origins: "*", headers: "*", methods: "*")]
public class UsersController : ApiController
{
private TestEntities db = new TestEntities();
// GET: api/Users
public IQueryable<User> GetUser()
{
return db.User;
}
// GET: api/Users/5
[ResponseType(typeof(User))]
public IHttpActionResult GetUser(string id)
{
User user = db.User.Find(id);
if (user == null)
{
return NotFound();
}
return Ok(user);
}
// PUT: api/Users/5
[ResponseType(typeof(void))]
public IHttpActionResult PutUser(string id, User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
if (id != user.UserID)
{
return BadRequest();
}
db.Entry(user).State = EntityState.Modified;
try
{
db.SaveChanges();
}
catch (DbUpdateConcurrencyException)
{
if (!UserExists(id))
{
return NotFound();
}
else
{
throw;
}
}
return StatusCode(HttpStatusCode.NoContent);
}
// POST: api/Users
[ResponseType(typeof(User))]
public IHttpActionResult PostUser(User user)
{
if (!ModelState.IsValid)
{
return BadRequest(ModelState);
}
db.User.Add(user);
try
{
db.SaveChanges();
}
catch (DbUpdateException)
{
if (UserExists(user.UserID))
{
return Conflict();
}
else
{
throw;
}
}
return CreatedAtRoute("DefaultApi", new { id = user.UserID }, user);
}
// DELETE: api/Users/5
[ResponseType(typeof(User))]
public IHttpActionResult DeleteUser(string id)
{
User user = db.User.Find(id);
if (user == null)
{
return NotFound();
}
db.User.Remove(user);
db.SaveChanges();
return Ok(user);
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
db.Dispose();
}
base.Dispose(disposing);
}
private bool UserExists(string id)
{
return db.User.Count(e => e.UserID == id) > 0;
}
}
}
Как правильно добавить Schoolclass для пользователя? Спасибо за вашу помощь