-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 Actual Codeさらに多くのプロパティがありますが、ナビゲーションプロパティは変更されません。 –

答えて

0

私は一時このisssueを解決しました。

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