3

ASP.Net MVC 3アプリケーションを作成していて、データベースを更新しようとすると外部キー制約の問題が発生します。移行を使用します。ASP.Net MVC 3 EF「テーブルにFOREIGN KEY制約を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります」

テーブル 'CategoryItemValues'にFOREIGN KEY制約 'FK_CategoryItemValues_CategoryProperties_CategoryPropertyId'を導入すると、サイクルまたは複数のカスケードパスが発生する可能性があります。 NO DELETE NO ACTIONまたはUP UP NO NO ACTIONを指定するか、他のFOREIGN KEY制約を変更してください。 制約を作成できませんでした。以前のエラーを参照してください。ここで

は私のクラスです:

public class Category 
{ 
    public int Id { get; set; } 
    [Display(Name = "Category Name")] 
    public string CategoryName { get; set; } 
    [Display(Name = "Display Name")] 
    public string DisplayName { get; set; } 
    [Display(Name = "Display Order")] 
    public int DisplayOrder { get; set; } 
    public bool IsTab { get; set; } 
    public bool Active { get; set; } 

    public virtual List<CategoryProperty> Properties { get; set; } 
} 

public class CategoryProperty 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    [Display(Name="Property Name")] 
    public string PropertyName { get; set; } 
    [Display(Name = "Display Order")] 
    public int DisplayOrder { get; set; } 

    public virtual Category Category { get; set; } 
} 

public class CategoryItem 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 

    public virtual Category Category { get; set; } 
    public virtual List<CategoryItemValue> Values { get; set; } 
} 

public class CategoryItemValue 
{ 
    public int Id { get; set; } 
    public int CategoryItemId { get; set; } 
    public int CategoryPropertyId { get; set; } 
    public string Value { get; set; } 

    public virtual CategoryItem Item { get; set; } 
    public virtual CategoryProperty Property { get; set; } 
} 

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // I know that the solution needs to go here! 
} 

私はCategoryItemValuesため削除にカスケードを無効にする必要がありますが、私はそれを行う方法がわからないですように思え。

modelBuilder.Entity < ...>() .HasRequired(...) .WithMany(...) .HasForeignKey(...) .WillCascadeOnDelete:私は、私のような何かをする必要があり知っています(偽)。

しかし、私はそれを正確に得ることはできません。

答えて

7

これは動作するはずです...

public class Category 
{ 
    public int Id { get; set; } 
    public string CategoryName { get; set; } 
    public string DisplayName { get; set; } 
    public int DisplayOrder { get; set; } 
    public bool IsTab { get; set; } 
    public bool Active { get; set; } 
    public virtual List<CategoryProperty> Properties { get; set; } 
    public virtual List<CategoryItem> Items { get; set; } 
} 
public class CategoryProperty 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    public string PropertyName { get; set; } 
    public int DisplayOrder { get; set; } 
    public virtual Category Category { get; set; } 
    public virtual List<CategoryItemValue> Values { get; set; } 
} 
public class CategoryItem 
{ 
    public int Id { get; set; } 
    public int CategoryId { get; set; } 
    public virtual Category Category { get; set; } 
    public virtual List<CategoryItemValue> Values { get; set; } 
} 
public class CategoryItemValue 
{ 
    public int Id { get; set; } 
    public int CategoryItemId { get; set; } 
    public int CategoryPropertyId { get; set; } 
    public string Value { get; set; } 
    public virtual CategoryItem Item { get; set; } 
    public virtual CategoryProperty Property { get; set; } 
} 

...と '要旨' ...

modelBuilder.Entity<CategoryProperty>() 
    .HasKey(i => i.Id); 

modelBuilder.Entity<CategoryProperty>() 
    .HasRequired(i => i.Category) 
    .WithMany(u => u.Properties) 
    .HasForeignKey(i => i.CategoryId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<CategoryItem>() 
    .HasKey(i => i.Id); 

modelBuilder.Entity<CategoryItem>() 
    .HasRequired(i => i.Category) 
    .WithMany(u => u.Items) 
    .HasForeignKey(i => i.CategoryId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<CategoryItemValue>() 
    .HasKey(i => i.Id); 

modelBuilder.Entity<CategoryItemValue>() 
    .HasRequired(i => i.Item) 
    .WithMany(u => u.Values) 
    .HasForeignKey(i => i.CategoryItemId) 
    .WillCascadeOnDelete(false); 

modelBuilder.Entity<CategoryItemValue>() 
    .HasRequired(i => i.Property) 
    .WithMany(u => u.Values) 
    .HasForeignKey(i => i.CategoryPropertyId) 
    .WillCascadeOnDelete(false); 
+0

ありがとうございました!それは完璧に働いた。 – MattSavage

+0

@MattSavage –

+0

あなたの 'DbContext'クラスの実装の中の@JotDhaliwalは、' OnModelCreating(DbModelBuilder modelBuilder) 'をオーバーライドします - これは典型的な使い方です、あるいはエンティティごとのEntityTypeConfigurationを使うことができます) – NSGaga

関連する問題

 関連する問題