1

我有两个类,每个类都实现一个接口。其中一个类包含另一个接口的 ICollection。

现在我想使用 EF 将它映射到我的数据库,但得到一个异常(如下)。这应该以某种方式实现吗?

我的类(产品和类别)的实体定义:

public interface IProduct
{
    string ProductId { get; set; }
    string CategoryId { get; set; }
}

public interface ICategory
{
    string CategoryId { get; set; }
    ICollection<IProduct> Products  { get; set; };
}

public class ProductImpl : IProduct
{
    public string ProductId { get; set; }
    public string CategoryId { get; set; }
}

public class CategoryImpl : ICategory
{
    public string CategoryId { get; set; }
    public ICollection<IProduct> Products { get; set; }
}

我想映射 CategoryImpl 和 ProductImpl 之间的关系,所以我OnModelCreating在我的 DbContext 中使用以下方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    var a = modelBuilder.Entity<CategoryImpl>();
    a.ToTable("Categories");
    a.HasKey(k => k.CategoryId);
    a.Property(p => p.CategoryId);
    a.HasMany(p => p.Products).WithOptional().HasForeignKey(p => p.CategoryId);

    var b = modelBuilder.Entity<ProductImpl>();
    b.ToTable("Products");
    b.HasKey(k => k.ProductId);
    b.Property(p => p.ProductId);
}

我得到的例外如下。我是否应该以某种方式指定要用于的具体类型IProductProductImpl

    System.InvalidOperationException: The navigation property 'Products' 
is not a declared property on type 'CategoryImpl'. Verify that it has 
not been explicitly excluded from the model and that it is a valid navigation property.
4

1 回答 1

0

使用 EF 中的接口无法做到这一点。必须为要映射的属性映射导航属性的类型。对于要映射的类型,它需要是一个具体的类型。

如果您需要不同类型的产品和类别,则可以为它们使用基类:

public class ProductBase
{
    public string ProductId { get; set; }
    public string CategoryId { get; set; }
}

public class CategoryBase
{
    public string CategoryId { get; set; }
    public virtual ICollection<ProductBase> Products { get; set; }
}

public class DerivedProduct : ProductBase
{
}

public class DerivedCategory : CategoryBase
{
}
于 2012-09-20T00:36:05.200 回答