8

Estoy usando ASP.NET MVC 3 y Entity Framework code first CTP 5. Me preguntaba si es posible agregar propiedades adicionales que no están mapeadas en una columna de la tabla.Agregando propiedades adicionales a entidad entidad 4 código primero entidad CTP 5

Me haved una clase de noticias y se define como tal:

public class News : Entity 
{ 
    public int NewsId { get; set; } 
    public string Title { get; set; } 
    public string Body { get; set; } 
    public bool Active { get; set; } 
} 

Mi clase de contexto de base de datos:

public class MyContext : DbContext 
{ 
    public DbSet<News> Newses { get; set; } 
} 

En la clase de entidad Tengo una propiedad definida como:

public IList<RuleViolation> RuleViolations { get; set; } 

No he codificado esta parte todavía, pero quiero que todas las reglas rotas se agreguen a esta lista cuando el objeto i s validado El error que estoy recibiendo es:

One or more validation errors were detected during model generation: 

    System.Data.Edm.EdmEntityType: : EntityType 'RuleViolation' has no key defined. Define the key for this EntityType. 
    System.Data.Edm.EdmEntitySet: EntityType: The EntitySet RuleViolations is based on type RuleViolation that has no keys defined. 

Aquí está mi código reposity:

public News FindById(int newsId) 
{ 
    return context.Database.SqlQuery<News>("News_FindById @NewsId", 
     new SqlParameter("NewsId", newsId)).FirstOrDefault(); 
} 

ACTUALIZACIÓN 2011-03-02:

Aquí está mi clase Entity:

public class Entity 
{ 
    public IList<RuleViolation> RuleViolations { get; set; } 

    public bool Validate() 
    { 
     // Still needs to be coded 
     bool isValid = true; 

     return isValid; 
    } 
} 

Aquí está mi RuleViolation cl culo:

public class RuleViolation 
{ 
    public RuleViolation(string parameterName, string errorMessage) 
    { 
     ParameterName = parameterName; 
     ErrorMessage = errorMessage; 
    } 

    public string ParameterName { get; set; } 
    public string ErrorMessage { get; set; } 
} 

Aquí está mi clase de contexto:

public class MyContext : DbContext 
{ 
    public DbSet<News> Newses { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<News>().Ignore(n => n.RuleViolations); 
    } 
} 

Respuesta

17

puede ignorar el tipo de uso de la API Fluido añadiendo una regla de ignorar a su método de OnModelCreating de la clase MyContext

public class MyContext : DbContext { 

    public DbSet<News> Newses { get; set; } 

    protected override void OnModelCreating(ModelBuilder builder) { 

    builder.Ignore<RuleViolation>() 

    } 

} 

O puede ignorar la propiedad utilizando el atributo NotMapped

public class Enitity { 

    [NotMapped] 
    public IList<RuleViolation> RuleViolations { get; set; } 

    //other properties here 

} 

y luego Entity Framework ignorará la propiedad.

+0

@David: ¿Dónde pondría exactamente este código? –

+0

@Brendan He actualizado la respuesta con un ejemplo de código. –

+0

@David: gracias por la respuesta extendida. ¿Debo incluir base.OnModelCreating (modelBuilder)? Si es así, ¿necesito incluir su código después o antes de este fragmento de código? –

4

También puede utilizar:

[NotMapped] 
public IList<RuleViolation> RuleViolations { get; set; } 

Para utilizar NotMapped hay que añadir using System.ComponentModel.DataAnnotations;

Editar:

ahora veo que se quiere evitar propiedad de asignación de la clase base. No funciona con OnModelCreating: se trata de un error confirmado en CTP5 (intentaré encontrar el enlace más adelante). No estoy seguro de si funciona con NotMappedAttribute. Este atributo es solo otro enfoque para lograr el mismo resultado.

+0

He decidido seguir con la sugerencia de Dave sobre el uso de OnModelCreating. ¿Por qué sugirió usar NotMapped en lugar de OnModelCreating? Todavía recibo el error a pesar de que hice lo que sugirió Dave. ¿Podrías ver mi publicación actualizada? –

+0

Agregué algunos detalles. –

+0

Usé modelBuilder.Ignore (); y funciona, pero como dije no me siento cómodo usándolo, preferiría Ignorar. Creo que por ahora voy a excluir derivar de mi clase Entity y mover la propiedad RuleViolations a mi clase News, luego el Ignore funciona perfectamente. Solo por ahora hasta que se solucione el error. –

Cuestiones relacionadas