繁体   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