11

Necesito agregar un campo en el modelo que la Base de datos no tiene realmente el campo.Entity Framework 4 (usando EDMX), cómo agregar un campo para modelar que DB no tiene realmente el campo

Porque, primero traté de agregar el campo en la clase Entity solamente.

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 
} 

y más tarde, cuando actualizar EDXM continuación EDMX eliminar los nuevos campos de la base de datos porque no tiene el campo. . :(

Así que agregar el campo en el modelo EDMX manualmente (Add -> Escalar la propiedad)

entonces producirá un error durante la compilación, el mensaje de error decir:

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:... 

Alguien sabe cómo añadir nuevos campos a la clase de entidad

Gracias

EDITADO pOR:?! Si su modelo i s una representación de su base de datos y en la base de datos no tiene el campo, ¿por qué desea agregarlo manualmente?

=>

Al recuperar los datos, el tipo de retorno del objeto se la clase de entidad.

y antes de pasar los datos del controlador a la vista, necesito agregar más datos (campos) en el resultado IQueryable.

ex)

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

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

y ahora Obtener los datos weborderln en el controlador. y antes de pasar la vista, necesito

agregar datos adicionales en el resultado.

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 

espero que podría explicar la pregunta :)

Gracias de nuevo.

+0

Si su modelo es una representación de su base de datos y en la base de datos no tiene el campo, ¿por qué desea agregarlo manualmente? – Dante

+0

@ Dante, gracias por su preocupación. Edité mi pregunta nuevamente, revise mi pregunta. Y si tiene alguna idea, por favor, avísenme. –

+0

Básicamente está describiendo el escenario para la utilización de ViewModels, es decir. modelos mapeados de los modelos de datos y derivados de la vista con el propósito de pasar datos a (y posiblemente desde) la vista. Ahora siempre me he preguntado qué fácil sería construir ViewModels en Entity Framework (porque podría querer usar y consultar servicios de OData, etc.), pero no sé si realmente pertenecen allí. – JayC

Respuesta

14

Debe crear una nueva parte parcial de la clase de entidad (en el nuevo archivo .cs) y añadir nuevos campos a la clase. No debe modificar la parte parcial creada por autogeneración porque los archivos autogenerados se sobrescribirán cada vez que cambie el archivo EDMX. Tampoco debe incluir el campo en EDMX porque EDMX define su asignación a base de datos = contiene solo campos en la base de datos.

crear un nuevo WebOrderPart.cs archivo en el mismo espacio de nombres como el montaje y sus clases generadas automáticamente que contienen:

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

¡Gracias por tu respuesta! ¿podría darme un poco más de pista sobre "Debe crear una nueva parte parcial de su clase de entidad (en el nuevo archivo .cs) y agregar nuevos campos a esa clase"? –

+0

Ver respuesta actualizada. –

+0

Creo una nueva clase para la entidad y copio todos los códigos originales en un archivo nuevo (WEBORDERLN2.cs) y también modifico el contexto y el tipo de retorno del repositorio a WEBORDERLN2. pero ocurre un error, dice "El tipo de entidad WEBORDERLN2 no es parte del modelo para el contexto actual". ¿Tienes alguna idea sobre esto? ¡Gracias! –

6

Dosn't [NotMapped] work.

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

En primer lugar, no se debe modificar el archivo de modelo de datos. Este archivo representa tus datos.

En segundo lugar, no debe devolver los objetos/colecciones de su modelo de datos de su repositorio.Esta es una práctica muy mala porque está creando una dependencia entre el Controlador/Vista y el Modelo. Sugiero que cree objetos de modelo personalizados que contengan las propiedades que necesita en su vista, asigne sus entidades a esos objetos de modelo y solo devuelva objetos de modelo o colecciones de objetos de modelo de su repositorio.

+0

¡Muchas gracias! –

+0

Sin preocupaciones mate;) – Dante

Cuestiones relacionadas