Recentemente ho eliminato una colonna ConversationId
dalle mie tabelle. Quando inizio a eseguire il debug del mio servizio e provo a salvare, visualizzo un errore:
Nome colonna non valido "ConversationId".
Codice:
public class AstootContext : DbContext
{
public AstootContext(DbContextOptions<AstootContext> options)
: base(options)
{ }
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
}
public DbSet<ServiceRequest> ServiceRequests { get; set; }
}
E la mia entità si presenta così:
public class ServiceRequest
{
public int Id { get; set; }
public int SenderUserId { get; set; }
public int PriceTypeId { get; set; }
public decimal Price { get; set; }
public bool IsAccepted { get; set; }
public DateTime Created { get; set; }
public int MessageId { get; set; }
}
Tutti i riferimenti a ConversationId
sono stati rimossi dal codice, l'ho ricostruito, ma sto ancora ricevendo questo errore e non capisco perché.
Questa è la mia tabella di SQL Server come puoi vedere non c'è ConversationId
:
Esiste una cache segreta che devo eliminare o qualcosa che devo eseguire per aggiornarlo?
EF Core è un ORM basato su codice, il più importante è M - Mapper. Non importa quale sia l'effettiva struttura del database, l'importante è ciò che EF * pensa * è basato sul modello del codice (classi di entità e relative proprietà, combinate con annotazioni di dati, configurazione fluente e serie di convenzioni).
Quindi il problema dovrebbe provenire dal codice. Poiché hai rimosso la proprietà esplicita , dovrebbe essere causato dalla proprietà shadow . E come spiegato nel link alla documentazione, le proprietà shadow vengono di solito introdotte per convenzione dalle relazioni:
Le proprietà shadow possono essere create per convenzione quando viene rilevata una relazione ma nessuna proprietà di chiave esterna viene trovata nella classe di entità dipendente. In questo caso, verrà introdotta una proprietà di chiave esterna shadow.
La documentazione spiega anche le regole di denominazione applicate in diversi scenari.
Una proprietà shadow denominata ConversationId
può essere introdotta in diversi modi, ma in base alle informazioni fornite, la causa più probabile è di avere una classe di entità chiamata Conversation
definisce una relazione uno a molti con ServiceRequest
avendo una proprietà di navigazione del tipo di raccolta:
public class Conversation
{
public int Id { get; set; }
// ...
public ICollection<ServiceRequest> ServiceRequests { get; set; }
}
Che secondo il tuo commento è stato effettivamente il caso.
Per completezza, ecco alcuni altri possibili scenari che generano tale proprietà:
(1) Nessuna proprietà di navigazione raccolta in Conversation
, proprietà di navigazione di riferimento in ServiceRequest
:
public class Conversation
{
public int Id { get; set; }
// ...
}
public class ServiceRequest
{
// ...
public Conversation Conversation { get; set; }
}
(2) Nessuna proprietà di navigazione in Conversation
e ServiceRequest
, configurazione fluente:
modelBuilder.Entity<Conversation>()
.HasMany<ServiceRequest>();
o
modelBuilder.Entity<ServiceRequest>()
.HasOne<Conversation>();
o variazioni di quanto sopra.
(3) Nessuna relazione coinvolta, proprietà shadow creata attraverso una configurazione fluente:
modelBuilder.Entity<ServiceRequest>()
.Property<int>("ConversationId");