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();
}
}
warum Sie Kontext in Ihrer Verbindungsklasse benötigen Wenn Sie contextId haben, wenn Sie das herausnehmen, wird das für Sie funktionieren? – Turbot
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
@Nitish Können Sie mir Controller-Klasse zeigen? – Win