2012-01-05 16 views
7

Estoy utilizando la última versión de Entity Framework (4.2) e intento implementar interfaces para mis Entidades y por alguna razón, no está compilando. está arrojando un error "Cannot convert expression type ICollection<IOrder> to return type ICollection<Order>". si no uso interfaces para las entidades, entonces no obtengo este error.error al usar interfaces para entidades de Entity Framework (4.2)

Tengo un proyecto separado para interfaces (para repositorios y servicios, etc.) y necesito pasar las entidades EF en esos métodos como parámetros y no quiero pasar las entidades reales en ellas, porque eso requerirá el proyecto de interfaz para tener una dependencia en las entidades EF.

mi objetivo es algo similar a la mencionada en este post Can I abstract Entity Framework away from my Entities?

aquí está la muestra. Acabo de poner una muestra aquí, mis entidades reales son diferentes, pero el problema es el mismo.

public interface IOrder 
{ 
    int OrderId { get; set; } 
    int CustomerId { get; set; } 
    ICustomer Customer { get; set; } 
} 

public class Order : IOrder 
{ 
    public int OrderId { get; set; } 
    public int CustomerId { get; set; } 
    ICustomer Customer { get; set; } 
} 

public interface ICustomer 
{ 
    int CustomerId { get; set; } 
    ICollection<IOrder> Orders { get; set; } 
} 

public class Customer : ICustomer 
{ 
    public int CustomerId { get; set; } 
    ICollection<IOrder> Orders { get; set; } 
} 

public class OrderMap : EntityTypeConfiguration<Order> 
{ 
    this.HasOptional(t => t.Customer) 
    .WithMany(t => t.Orders) //error comes from this line 
    .HasForeignKey(d => d.CustomerId); 
} 
+0

posible solución al http://stackoverflow.com/questions/9805329/how-to-use-interface-properties-with-codefirst/10994290 # 10994290 – Cel

Respuesta

6

Entity framework no puede trabajar con interfaces. Sus propiedades de navegación deben usar los tipos de entidad real (clases mapeadas).

+0

pero tengo un proyecto que consiste solo en interfaces, por ejemplo, digamos que tengo un "IOrderService" que tiene un método llamado "IEnumerable GetOrders (Cliente ICustomer) "(que a su vez llamará a un repositorio para obtener datos. Por favor, no intente encontrar fallas en esto, es solo un ejemplo). No puedo usar el tipo de entidad real aquí porque este proyecto necesita tener una referencia a entidades reales que parece no ser el enfoque correcto, es decir, el proyecto de interfaz que tiene una referencia al tipo real. debería ser normalmente de otra forma. – RKP

+0

, de hecho, tengo todas las entidades EF en un proyecto separado del proyecto Entity Framework para utilizarlas como objetos comerciales sin ninguna dependencia de la persistencia. todo el mapeo y el contexto de la base de datos, etc. están en un proyecto separado, tiene una referencia al proyecto de las entidades. – RKP

+0

Esto no depende de la persistencia. Esto es solo dependencia entre entidades y EF lo exige. Simplemente EF no lo admite y no conozco ninguna solución alternativa. Combina tus interfaces y entidades con un solo ensamblaje y define las propiedades de navegación con tipos de entidades reales. –

1

"Usted puede añadir sus propios archivos de clase parcial para especificar las interfaces que deberán realizarse - y para proporcionar cualquiera de los métodos de implementación reales que necesita" - como se sugiere here

Cuestiones relacionadas