簡體   English   中英

ASP.net Web API Angular 8 更新不工作

[英]ASP.net Web API Angular 8 Update not working

我正在為我的后端使用帶有 EntityFramework 和 MSSQL 的 Asp.net Web API。 對於我的前端,我使用的是 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 條目?

我的 Web API 上沒有 UserToSchoolclass 資源,因為我有一個 User 和一個 Schoolclass 資源。

API 的用戶 object 看起來像這樣:

[ UserID: "A3453z839385", Firstname: "Benjamin", Lastname: "Ellmer", Schoolclass: [] ]

我的更新方法如下所示:

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 的正確方法是什么? 謝謝你的幫助

伙計們感謝大家的幫助。 我非常專注於使用 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();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM