ASP.net Web API Angular 8 Обновление не работает - PullRequest
1 голос
/ 30 сентября 2019

Я использую веб-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 для пользователя? Спасибо за вашу помощь

1 Ответ

0 голосов
/ 01 октября 2019

Ребята, спасибо всем за помощь. Я был так сосредоточен на использовании автоматически сгенерированного кода Visual Studio, что не думал о возможности написать свой собственный метод.

Так что я не смог решить проблему с обновлением, но нашел лучший способ решения своей проблемы. проблема. Вот мое решение:

[ResponseType(typeof(void))]
[Route("Users/{id}/AddSchool")]
    public IHttpActionResult PostAddSchoolToUser(string id, School school)
    {
       User user = db.User.Find(id);
       if (user == null)
       {
             return NotFound();
       }

       if (school == null)
       {
          return NotFound();
       }

       if (user.School.Contains(school))
       {
          return Conflict();
       }

       user.School.Add(school);
       school.User.Add(user);

       try
       {
         db.SaveChanges();
       }
       catch (DbUpdateException)
       {
         throw;
       }
         return Ok();
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...