5

Ho una classe chiamata Client mappata a una tabella di database utilizzando il codice Entity Framework per primo. La tabella ha un campo calcolato che ho bisogno di essere disponibile nella mia classe Client, ma capisco che non sarà possibile scrivere in questo campo. Esiste un modo per configurare Entity Framework in modo da ignorare la proprietà durante il salvataggio, ma includere la proprietà durante la lettura?Entity Framework Code First - Come ignorare una colonna quando si salva

Ho provato a utilizzare il metodo Ignore nella mia classe di configurazione o l'attributo [NotMapped], ma ciò impedisce la lettura della proprietà dal database.

proprietà

risposta

9

È possibile utilizzare DatabaseGeneratedAttribute con DatabaseGeneratedOption.Computed opzione:

[DatabaseGenerated(DatabaseGeneratedOption.Computed)] 
public ComputedPropertyType ComputedProperty { get; set; } 

o se si preferisce API fluente è possibile utilizzare HasDatabaseGeneratedOption metodo nella DbContext classe:

public class EntitiesContext : DbContext 
{ 
    public DbSet<EntityType> Enities { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<EntityType>().Property(e => e.ComputedProperty).HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
    } 
} 
+1

Grazie, sembra essere la risposta. Tuttavia, dal momento che sto usando la mia proprietà calcolata come riferimento di chiave esterna a un'altra tabella, ora sto ottenendo "Una proprietà dipendente in un ReferentialConstraint è mappata a una colonna generata dal negozio." Non sarà più possibile utilizzarlo come riferimento di chiave esterna? –

+0

@ EasyTimer Onestamente ho difficoltà a immaginare un simile scenario. Dal punto di vista EF questo non è possibile perché EF deve essere in grado di aggiornare la chiave esterna se si modifica il riferimento nell'applicazione. Forse nel tuo caso (dato che non conosco i tuoi requisiti esatti) avendo solo le proprietà di navigazione sarebbe sufficiente, dai un'occhiata qui: http://stackoverflow.com/questions/5691780/navigation-property-without-declaring-foreign -key – tpeczek

+0

Ho risolto il mio problema dividendo le mie classi in due come in questo articolo http://weblogs.asp.net/manavi/archive/2011/04/24/associations-in-ef-4-1-code- first-part-4-table-splitting.aspx Ho una classe che contiene il campo calcolato e un'altra classe che contiene tutti i campi che devo essere in grado di modificare. –

3

Mark calcolata:

modelBuilder 
    .Entity<MyEntityType>() 
    .Property(_ => _.MyProperty) 
    .HasDatabaseGeneratedOption(DatabaseGeneratedOption.Computed); 
+0

Grazie, sembra essere il risposta. Tuttavia, dal momento che sto usando la mia proprietà calcolata come riferimento di chiave esterna a un'altra tabella, ora sto ottenendo "Una proprietà dipendente in un ReferentialConstraint è mappata a una colonna generata dal negozio." Non sarà più possibile utilizzarlo come riferimento di chiave esterna? –

+0

@ EasyTimer: proprietà calcolata come chiave esterna? OH MIO DIO. Cosa faresti se il risultato del calcolo non corrispondesse a nessun valore della chiave primaria nella tabella delle chiavi primarie? – Dennis

+0

Mi rendo conto che è uno scenario insolito e non ideale. Come accade, la tabella delle chiavi primarie è di per sé una vista la cui chiave primaria è calcolata allo stesso modo della tabella delle chiavi esterne e non è probabile che vi siano discrepanze. Fa tutto parte dell'introduzione di un nuovo codice in un sistema legacy, in cui le mie mani sono legate leggermente. –