-1

我有这个表&类:Ef中核TPH和关系问题

public abstract class ProductBase 
{ 
    public int Id { get; set; } 
} 
public class Product:ProductBase 
{ 

    public virtual ICollection<ProductType> Types { get; set; } = new HashSet<ProductType>(); 
    public virtual ICollection<OnlineStock> OnlineStocks { get; set; } = new HashSet<OnlineStock>(); 
} 
public abstract class ProductTypeBase 
{ 
    [Key] 
    public int Id { get; set; } 
    public int ProductId { get; set; } 
    public int Quantity{ get; set; } 
    [ForeignKey("ProductId")] 
    protected virtual Product Product { get; set; } 
} 
public class ProductType:ProductTypeBase 
{ 
    public new Product Product 
    { 
     get { return base.Product; } 
     set { base.Product = value; } 
    } 
} 
public class OnlineStock:ProductTypeBase 
{ 
    public new Product Product 
    { 
     get { return base.Product; } 
     set { base.Product = value; } 
    } 
    public virtual ICollection<ProductTypePicture> Pictures { get; set; } = new HashSet<ProductTypePicture>(); 

} 

当我要添加新的产品与producttype。

Context.Porduct.Add(new Product 
    { 
    Types=new List<ProductTypes> 
      { 
      new ProductTypes {Quantity=8} 
      } 
    }) 

ef错误:“无法投射'ProductType'类型的对象以键入'OnlineStock'。”

而且我有这个配置:

entityBuilder.Entity<Product>().HasMany(x=>x.Types).WithOne(x=>x.Product).HasForeignKey("ProductId"); 
     entityBuilder.Entity<Product>().HasMany(x=>x.OnlineStocks).WithOne(x=>x.Product).HasForeignKey("ProductId"); 
+2

也不要使用'new',使用'virtual'和'override'。 'new'只会隐藏成员,当您调用基础类型的属性时,您将获得其他属性。在开始更复杂的项目之前,最好先从初学者的书籍或继承教程入手。而在你的情况下,'Product'属性的新增和重写都是不必要的 – Tseng

+1

这是**实际的**代码还是只是你输入的问题?因为它看起来与上面给出的代码不匹配 – Tseng

+0

@Tseng实际代码只是有更多的属性,但导航属性没有改变。 –

回答

0

我解决了这个isssue临时。

var NP=new Product(); 
    Context.Porduct.Add(NP); 
    Context.saveChanges(); 
    NP.Types.Add(new ProductTypes 
       { 
        Quantity=8 
       }); 
    Context.saveChanges();