0

Ich habe zwei Modelle, die wie folgt verbunden sind:ASP.Net Kern verwandte Modelle Feld erforderlich Fehler

public class Context 
    { 
     [Key] 
     public long ContextId { get; set; } 
     [Required] 
     public string Role { get; set; } 

     public ICollection<Connection> Connections { get; set; } 

     public Context() 
     { 

     } 
    } 

Und

public class Connection 
    { 
     [Key] 
     public long ConnectionId { get; set; } 
     public string Name { get; set; } 

     public long ContextId { get; set; } 
     public Context Context { get; set; } 

     public Connection() 
     { 

     } 
    } 

habe ich ein Repository für Context:

public class ContextRepository: IContextRepository 
{ 
    private readonly WebAPIDataContext _db; 

    public ContextRepository(WebAPIDataContext db) 
    { 
     _db = db; 
    } 

    public Context CreateContext(Context context) 
    { 
     _db.Contexts.Add(context); 
     _db.SaveChanges(); 
     return context; 
    } 

    public void DeleteContext(long id) 
    { 
     Context context = GetContext(id); 
     if (context != null) 
     { 
      _db.Contexts.Remove(context); 
      _db.SaveChanges(); 
     } 
    } 

    public List<Context> GetAllContexts() 
    { 
     return _db.Contexts 
      .Include(context => context.Connections) 
      .ToList(); 
    } 

    public Context GetContext(long id) 
    { 
     return _db.Contexts.FirstOrDefault(o => o.ContextId == id); 
    } 

    public void UpdateContext(long id, Context context) 
    { 
     Context contextToUpdate = _db.Contexts.FirstOrDefault(o => o.ContextId == id); 
     contextToUpdate.Role = context.Role; 
     contextToUpdate.Connections = context.Connections; 
     _db.Update(contextToUpdate); 
     _db.SaveChanges(); 

    } 
} 

Swagger gibt mir Skelett wie folgt:

{ 
    "contextId": 0, 
    "role": "string", 
    "connections": [ 
    { 
     "connectionId": 0, 
     "name": "string", 
     "contextId": 0, 
     "context": {} 
    } 
    ] 
} 

Wenn ich "Role":"Worker" und "name":"Max" und tun POST füllen oder ähnliches in PUT dann es gibt mir eine Fehlermeldung:

{ 
    "Connections[0].Context.Role": [ 
    "The Role field is required." 
    ] 
} 

Warum ist es so? Ich möchte in der Lage sein, Daten POST oder PUT, auch wenn ich connections verwandte Felder nicht füllen. Im Moment habe ich Controller nur für Context.

UPDATE: Controller:

[Route("api/[controller]")] 
public class ContextController : Controller 
{ 
    private readonly IContextRepository _contexts; 
    public ContextController(IContextRepository contexts) 
    { 
     _contexts = contexts; 
    } 

    [HttpGet("")] 
    public IActionResult GetAllContexts() 
    { 
     try 
     { 
      List<Context> contexts = _contexts.GetAllContexts(); 
      return Ok(contexts); 
     } 
     catch (EntityNotFoundException<Context>) 
     { 
      return NotFound(); 
     } 

    } 

    [HttpGet("{id}")] 
    public IActionResult GetContext(long id) 
    { 
     Context context= _contexts.GetContext(id); 
     if (context == null) 
     { 
      return NotFound(); 
     } 
     return Ok(context); 
    } 

    [HttpPost] 
    public IActionResult CreateContext([FromBody] Context context) 
    { 
     if (ModelState.IsValid == false) 
     { 
      return BadRequest(ModelState); 
     } 

     Context createdContext= _contexts.CreateContext(context); 
     if (createdContext== null) 
     { 
      return NotFound(); 
     } 
     return CreatedAtAction(
      nameof(GetContext), new { id = createdContext.ContextId}, createdContext); 

    } 

    [HttpPut("{id}")] 
    public IActionResult UpdateContext(long id, [FromBody] Context context) 
    { 
     if (ModelState.IsValid == false) 
     { 
      return BadRequest(ModelState); 
     } 

     try 
     { 
      _contexts.UpdateContext(id, context); 
      return Ok(); 
     } 
     catch (EntityNotFoundException<Context>) 
     { 
      return NotFound(); 
     } 
    } 

    [HttpDelete("{id}")] 
    public IActionResult DeleteCOntext(long id) 
    { 
     _contexts.DeleteContext(id); 
     return Ok(); 
    } 
} 
+0

warum Sie Kontext in Ihrer Verbindungsklasse benötigen Wenn Sie contextId haben, wenn Sie das herausnehmen, wird das für Sie funktionieren? – Turbot

+0

Dies ist mein allererstes Mal mit asp.net Core und ich folgte Tutorial von Modellbeziehungen (https://docs.microsoft.com/en-us/ef/core/modeling/relationships), es wurde dort so gegeben. Ich baue Web API, in diesem Fall wird diese Navigationseigenschaft nicht benötigt? – Nitish

+0

@Nitish Können Sie mir Controller-Klasse zeigen? – Win

Antwort

0

Dies liegt daran, dass Sie virtuelle Keyword in Ihrer Beziehung Felder verpasst haben. Hier Hinzufügen von virtuellen Keyword Feld Verbindungen in Context Klasse

public virtual ICollection<Connection> Connections { get; set; } 

und Kontext in Verbindung Klasse wird die Ausgabe

public virtual Context Context { get; set; } 

Für weitere Informationen lösen lesen this anwser

+0

Muss ich die Datenbank nach dem Hinzufügen von virtuell migrieren und aktualisieren? Außerdem ist 'öffentlicher virtueller Kontext Kontext {erhalten; einstellen; } 'überhaupt notwendig, wenn ich Web API (Verweis auf den ersten Kommentar zu meiner Frage) bauen? – Nitish

+0

dont think though ... tatsächlich hängt es von Ihren Zuordnungen ab .. haben Sie ContextId-Feld in Verbindung als Fremdschlüssel in Ihrer Datenbank zugeordnet – CPR43

+0

Nein, nicht explizit. Sehen Sie meine Modelle in Fragen, darauf beziehen Sie sich richtig? – Nitish

Verwandte Themen