3

我正在创建一个ASP.Net MVC 3应用程序,并且在尝试更新我的数据库时遇到外键约束问题使用迁移。我使用的代码优先,而我得到的错误是:ASP.Net MVC 3 EF“在表中引入FOREIGN KEY约束可能导致循环或多个级联路径”

引进国外KEY约束“FK_CategoryItemValues_CategoryProperties_CategoryPropertyId”表“CategoryItemValues”可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE 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 2012-04-23 21:53:52

+0

在哪里写下部代码@MattSavage – 2014-08-27 14:48:16

+0

@JotDhaliwal你'DbContext'类实现内,覆盖'OnModelCreating(DbModelBuilder模型构建器)' - 这是典型的使用,或者你可以每个实体使用EntityTypeConfiguration(有点不同,但类似) – NSGaga 2014-08-27 16:44:38