Ho un progetto Xamarin.Forms con una pagina di registrazione utente, che invia un oggetto Cliente serializzato tramite HttpClient a un metodo [HttpPost] del controller API Web Core di ASP.NET. Il corpo di questo metodo [HttpPost] deve aggiungere una riga a una tabella Customers in un database SQL Server ospitato in Azure, tramite Entity Framework Core.
Questa è la classe RegistrationController nel mio progetto API Web ASP.NET Core:
[Route("api/[controller]")]
public class RegistrationController : Controller
{
private readonly RegistrationContext _context;
public RegistrationController(RegistrationContext context)
{
_context = context;
}
[HttpPost]
public async Task<IActionResult> Post([FromBody] Customer customer)
{
var customerEntry = new Customer
{
FirstName = customer.FirstName,
LastName = customer.LastName,
EmailAddress = customer.EmailAddress,
PhoneNumber = customer.PhoneNumber
};
try
{
_context.Add(customerEntry);
await _context.SaveChangesAsync();
}
catch (Exception ex)
{
Debug.WriteLine(ex.Message);
}
return Ok(true);
}
}
E questa è la classe RegistrationContext:
public class RegistrationContext : DbContext
{
public virtual DbSet<Customer> Customers { get; set; }
public RegistrationContext(DbContextOptions<RegistrationContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.Entity<Customer>(entity =>
{
entity.Property(e => e.FirstName).IsRequired();
entity.Property(e => e.LastName).IsRequired();
entity.Property(e => e.EmailAddress).IsRequired();
entity.Property(e => e.PhoneNumber).IsRequired();
});
}
}
Il database di Azure SQL Server è configurato nel file Startup.cs:
public void ConfigureServices(IServiceCollection services)
{
container.services.AddMvc();
var connection = @"Server=myAzureSQLServerUrl;Database=myDatabaseName;User Id=mySQLServerLoginId;Password=mySQLServerPassword;";
services.AddDbContext<RegistrationContext>(options => options.UseSqlServer(connection));
}
Per qualche motivo, continuo a ricevere un codice di stato HTTP 500 come risposta quando eseguo il metodo PostSync di HttpClient dall'applicazione client Xamarin.Forms, che molto probabilmente significa che c'è qualcosa di sbagliato nel codice all'interno del corpo di RegistrationController (o RegistrationContext) nell'API Web.
Test su localhost rivela questa eccezione in attesa di _context.SaveChangesAsync () ;:
{System.Data.SqlClient.SqlException (0x80131904): impossibile inserire il valore NULL nella colonna "Id", tabella "zwabydb.dbo.Customers"; la colonna non consente null. INSERT fallisce. La dichiarazione è stata chiusa.
Entity Framework Core non assegna automaticamente la proprietà intero Id dell'oggetto Cliente? (L'ho impostato come chiave primaria nel database di SQL Server). Se assegno manualmente un valore alla proprietà Id nel metodo [HttpPost], ad esempio 1, ora ottengo 200 OK.
Grazie!
Questo dipende da come si imposta il database SQL. Se si dispone di una colonna Id id, è necessario impostare le proprietà seed e autoincrement per definire automaticamente un valore in tale colonna.
Se il tuo Id è una stringa, dovrai definire manualmente un valore. Normalmente qualcosa come un GUID. es. Guid.NewGuid (). ToString ()