11

Ho bisogno di aggiungere un campo nel modello che Database non ha effettivamente il campo.Entity Framework 4 (utilizzando EDMX), come aggiungere un campo per modellare che DB non ha effettivamente il campo

Perché, in primo luogo, ho provato ad aggiungere il campo solo alla classe Entity.

public partial class Weborder 
{ 
    (Auto Generated) 
    public int orderno {get; set;} 
    . 
    . 
    . 
    (Add Manually) 
    public string newField1 {get; set;} //this is new field that DB does not have 
    public string newField2 {get; set;} //this is new field that DB does not have 
} 

e più tardi, quando ho aggiornare EDXM poi EDMX rimuovere i nuovi campi perché il database non ha il campo. . :(

Così ho aggiungere il campo in EDMX modello manualmente (Add -> Proprietà scalare)

poi un errore si verifica durante la compilazione, il messaggio di errore dire:

Error 1 Error 3004: Problem in mapping fragments starting at line 399:No mapping specified for properties ... 
An Entity with Key (PK) will not round-trip when:... 

Qualcuno sa come aggiungere nuovi campi nella classe di entità

Grazie

curato per:?! Se il modello i s una rappresentazione del tuo database e nel database non hai il campo, perché vuoi aggiungerlo manualmente?

=>

Quando recuperare i dati, il tipo di ritorno di oggetto è la classe entità.

e prima di passare i dati dal controller per visualizzare, ho bisogno di aggiungere più dati (campi) nel risultato IQueryable.

ex)

public DbSet<WEBORDERLN> WEBORDERLNs { get; set; } 

//repository 
public IQueryable<WEBORDERLN> WebOrderLns 
{ 
     get { return context.WEBORDERLNs; } 
} 

e ora ottenere i dati weborderln controller. e prima di passare la vista, devo

aggiungere dati supplementari nel risultato.

var data = webOrderLnRepository.WebOrderLns.Where(e => e.PICKNO == OrderNo).ToList(); 

foreach (WEBORDERLN weborderln in data) 
{ 
    weborderln.[NEW FIELD] = "EXTRA DATA"; //// FOR THIS, I NEED TO ADD NEW FILED INTO ENTITY CLASS 
} 

//return data 

spero che potrebbe spiegare la questione :)

Grazie ancora.

+0

Se il modello è una rappresentazione del database e nel database non si dispone del campo, perché si desidera aggiungerlo manualmente? – Dante

+0

@Dante, grazie per la vostra preoccupazione. Ho modificato di nuovo la mia domanda, per favore rivedi la mia domanda. E se hai qualche idea, ti prego di consigliarmi. –

+0

In pratica stai descrivendo lo scenario per l'utilizzo di ViewModels, ovvero. modelli mappati dai modelli di dati e derivati ​​dalla vista allo scopo di passare dati (e possibilmente dalla) vista. Ora mi sono sempre chiesto quanto sarebbe stato facile creare ViewModels in Entity Framework (perché potrei voler usare e interrogare OData Services, ecc.) Ma non so che siano realmente lì. – JayC

risposta

14

È necessario creare una nuova parte parziale della classe di entità (nel nuovo file .cs) e aggiungere nuovi campi a tale classe. Non è necessario modificare la parte parziale creata dall'autogenerazione perché i file generati automaticamente verranno sovrascritti ogni volta che si modifica il file EDMX. Inoltre, non devi includere il campo in EDMX perché EDMX definisce il tuo mapping su database = contiene solo campi nel database.

Creare un nuovo WebOrderPart.cs file nella stessa assemblea e namespace come le vostre classi generati automaticamente che contengono:

public partial class Weborder 
{ 
    public string newField1 {get; set;} 
    public string newField2 {get; set;} 
} 
+0

Grazie per la risposta! potresti darmi qualche suggerimento in più su "Devi creare una nuova parte parziale della tua classe di entità (nel nuovo file .cs) e aggiungere nuovi campi a quella classe."? –

+0

Controllare la risposta aggiornata. –

+0

Creo una nuova classe per l'entità e copio tutti i codici originali in un nuovo file (WEBORDERLN2.cs) e inoltre modifico il tipo di oggetto restituito di contesto e repository su WEBORDERLN2. ma si verifica un errore, si dice "Il tipo di entità WEBORDERLN2 non fa parte del modello per il contesto corrente." hai qualche idea su questo? Grazie! –

6

Dosn't [NotMapped] lavoro.

[NotMapped] 
public string newField1 {get; set;} 
3

Prima di tutto, non si deve modificare il file di modello di dati. Questo file rappresenta i tuoi dati.

In secondo luogo, non si devono restituire gli oggetti/le raccolte del modello dati dal repository.Questa è una pessima pratica perché si sta creando una dipendenza tra il Controller/Vista e il Modello. Ti suggerisco di creare oggetti Modello personalizzati che contengano le proprietà di cui hai bisogno nella Vista, associare le entità a tali oggetti Modello e restituire solo oggetti Modello o raccolte di oggetti Modello dal tuo Deposito.

+0

Grazie mille! –

+0

Nessun problema amico;) – Dante