2012-01-05 4 views
7

Я использую последнюю версию Entity Framework (4.2) и пытаюсь реализовать интерфейсы для своих объектов, и по какой-то причине она не компилируется. он выдает ошибку «Cannot convert expression type ICollection<IOrder> to return type ICollection<Order>». если я не использую интерфейсы для сущностей, то я не получаю эту ошибку.ошибка при использовании интерфейсов для объектов Entity Framework (4.2)

У меня есть отдельный проект для интерфейсов (для репозиториев и сервисов и т. Д.), И мне нужно передать объекты EF в этих методах в качестве параметров, и я не хочу передавать фактические объекты в них, потому что это потребует интерфейса, чтобы иметь зависимость от объектов EF.

моя цель несколько похожа на один, упомянутых в этом посте Can I abstract Entity Framework away from my Entities?

здесь образец. Я просто поставил образец здесь, мои фактические сущности разные, но проблема такая же.

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

возможный обходной путь на http://stackoverflow.com/questions/9805329/how-to-use-interface-properties-with-codefirst/10994290 # 10994290 – Cel

ответ

6

Сущность инфраструктуры не может работать с интерфейсами. В свойствах навигации должны использоваться реальные типы объектов (сопоставленные классы).

+0

, но у меня есть проект, который состоит только из интерфейсов, например, скажем, у меня есть «IOrderService», который имеет метод «IEnumerable GetOrders (Клиент ICustomer) »(который, в свою очередь, вызовет репозиторий для сбора данных. PLS не пытается найти ошибку с этим, это просто пример). Я не могу использовать реальный тип сущности здесь, потому что этот проект должен иметь ссылку на реальные сущности, которые, кажется, не подходят, т. Е. Проект интерфейса, имеющий ссылку на реальный тип. это должно быть обычно наоборот. – RKP

+0

Фактически у меня есть все объекты EF в отдельном проекте из проекта Entity Framework, чтобы использовать их в качестве бизнес-объектов без какой-либо зависимости от сохранения. все сопоставление и контекст базы данных и т. д. находятся в отдельном проекте, он имеет ссылку на проект сущностей. – RKP

+0

Это не зависимость от настойчивости. Это просто зависимость между объектами и EF требует этого. Просто EF не поддерживает его, и я не знаю об обходном пути. Объедините свои интерфейсы и объекты в единую сборку и определите свойства навигации с реальными типами сущностей. –

1

«Вы можете добавить свои собственные файлы частичного класса для определения интерфейсов, которые будут реализованы - и предоставлять какие-либо фактические методы реализации нужно» - как это было предложено here

Смежные вопросы