2012-01-05 76 views
7

我正在使用实体框架(4.2)的最新版本并尝试为我的实体实现接口,并且由于某些原因,它不会编译。它会抛出错误“Cannot convert expression type ICollection<IOrder> to return type ICollection<Order>”。如果我不使用接口的实体,那么我不会得到这个错误。当为实体框架(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

可能的解决方法/ 9805329/how-to-use-interface-properties-with-codefirst/10994290#10994290 – Cel 2012-06-12 10:22:42

回答

6

实体框架无法使用接口。您的导航属性必须使用真实的实体类型(映射类)。

+0

但我有一个只包含接口的项目让我说我有一个名为“IEnumerable GetOrders(IOrderService) ICustomer客户)“(这又会调用一个存储库来获取数据,请不要试图找到这个错误,这仅仅是一个例子)。我不能在这里使用真正的实体类型,因为这个项目需要引用真实的实体,这看起来不是正确的方法,即接口项目引用了真实类型。它通常应该是其他方式。 – RKP 2012-01-05 19:05:37

+0

事实上,我将Entity Framework项目的一个单独项目中的所有EF实体都用作业务对象,而不依赖于持久性。所有的映射和​​数据库上下文等都在一个单独的项目中,它具有对实体项目的引用。 – RKP 2012-01-05 19:06:06

+0

这不依赖于持久性。这只是实体和EF对它的依赖。简单的EF不支持它,我不知道任何解决方法。将您的接口和实体合并为单个程序集,并使用真实实体类型定义导航属性。 – 2012-01-05 19:11:54

1

“你可以添加自己的部分类文件来指定要实现的接口 - 并提供您所需要的任何实际的实施方法” - 作为http://stackoverflow.com/questions建议here