[英]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.