我创建一个ASP.Net MVC 3应用程序,我试图用迁移来更新我的数据库,当运行到一个外键约束问题。 我使用的代码优先,而我得到的错误是:
表“CategoryItemValues”引入外来KEY约束“FK_CategoryItemValues_CategoryProperties_CategoryPropertyId”可能会导致循环或多个级联路径。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他外键约束。 无法创建约束。 请参阅以前的错误。
这里是我的类:
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(假);
但我不能把它完全正确。
这应该工作...
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);
文章来源: ASP.Net MVC 3 EF “Introducing FOREIGN KEY constraint on table may cause cycles or multiple cascade paths”