2016-11-20 1 views
1

(Id, TypeListId, Name)のモデルには、(Id, TypeListId, Name)という名前のモデルがあり、多数のリストが含まれています。例えばエンティティフレームワーク:同じモデルの複数のナビゲーションプロパティが、移行の追加時にエラーを引き起こす

ProductType: Strong, Weak, Medium

ProductCategory: Category 1, Category 2, Category 3

私はこのようになります製品のモデルがあります:私は、移行を追加するために移動してdotnet ef database updateとき「私はエラーを取得し、しかし

public int Id {get; set;} 
public string Name {get; set;} 
public int ProductTypeId {get; set;} 
public int ProductCategoryId {get; set;} 

// Navigation Properties 
public TypeListItem ProductType {get; set;} 
public TypeListItem ProductCategory {get; set;} 

を:

Introducing FOREIGN KEY constraint : FK_Product_TypeListItem_ProductCategoryId on table 'Product' may cause cycles or multiple cascade paths.

私も持っています彼は流暢なAPIを使用して次のように:

builder.Entity<Product>() 
    .Property(p => p.ProductTypeId) 
    .IsRequired(); 
builder.Entity<Product>() 
    .Property(p => p.ProductCategoryId) 
    .IsRequired(); 

私は同じオブジェクトを使用する2つのナビゲーションプロパティがあり、両方とも必要であると考えています。

推奨事項私のモデルに何か問題はありますか?

これはefコアにとって意味がありますか?

builder.Entity<Product>() 
     .HasOne(p => p.ProductType) 
     .WithOne().OnDelete(DeleteBehavior.Restrict); 

    builder.Entity<Product>() 
     .HasOne(p => p.ProductCategory) 
     .WithOne().OnDelete(DeleteBehavior.Restrict); 
+0

あなたは 'TypeListItem'のコードを表示することができますか? – Sampath

+0

それには何もありません。 Just Id、TypeListId、およびNameプロパティ。 –

答えて

1

以下に示すようにOnDelete(DeleteBehavior.Restrict)を使用する必要があります。

注:

Restrict : The delete operation is not applied to dependent entities. The dependent entities remain unchanged.

builder.Entity<Product>() 
    .Property(p => p.ProductTypeId) 
    .WithOne() 
    .OnDelete(DeleteBehavior.Restrict); 

builder.Entity<Product>() 
    .Property(p => p.ProductCategoryId) 
    .WithOne() 
    .OnDelete(DeleteBehavior.Restrict); 

あなたはここで多くを見ることができます:Cascade Delete

+0

私はこれがEF6の答えだと信じていますが、私はEF Coreでそれを行うことができる必要があり、構文を変更したと思います。最新の投稿をご覧ください。あなたは空のWithOne()が理にかなっていると思いますか? https://docs.microsoft.com/en-us/ef/core/modeling/relationships?highlight=cascade#cascade-delete –

+0

はい、そうです。回答を更新しました。 – Sampath

+0

答えの構文が妥当ではないと思います。私はあなたがIsRequiredとWithOneを同じステートメントに一緒に参加させることはできないと信じています。それ以外の場合は正しい答えです。 –

関連する問題