Итак, это беспокоило меня; Я решил изменить свой DbContext . Сначала я отключил все каскадные удаления, а затем обновил базу данных следующим образом:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Table renames
modelBuilder.Entity<Criteria>().ToTable("Criteria");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
// One to One
modelBuilder.Entity<Attribute>().HasOptional(m => m.Type).WithRequired(m => m.Attribute).WillCascadeOnDelete(false);
modelBuilder.Entity<Attribute>().HasOptional(m => m.Operation).WithRequired(m => m.Attribute).WillCascadeOnDelete(false);
modelBuilder.Entity<Answer>().HasOptional(m => m.Scenario).WithRequired(m => m.Answer).WillCascadeOnDelete(false);
modelBuilder.Entity<Answer>().HasOptional(m => m.Criteria).WithMany().HasForeignKey(m => m.CriteriaId).WillCascadeOnDelete(false);
// One to Many
modelBuilder.Entity<Criteria>().HasMany(m => m.Attributes).WithRequired().HasForeignKey(m => m.CriteriaId).WillCascadeOnDelete(false);
modelBuilder.Entity<IdentityRole>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.RoleId).WillCascadeOnDelete(false);
modelBuilder.Entity<Organisation>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.OrganisationId).WillCascadeOnDelete(false);
modelBuilder.Entity<Organisation>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.OrganisationId).WillCascadeOnDelete(false);
modelBuilder.Entity<Question>().HasMany(m => m.Answers).WithRequired(m => m.Question).HasForeignKey(m => m.QuestionId).WillCascadeOnDelete(false);
modelBuilder.Entity<Category>().HasMany(m => m.Sortations).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(false);
modelBuilder.Entity<Category>().HasMany(m => m.Criteria).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(false);
modelBuilder.Entity<Category>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(false);
modelBuilder.Entity<Category>().HasMany(m => m.Questions).WithOptional().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(false);
modelBuilder.Entity<Category>().HasMany(m => m.Quotes).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(false);
modelBuilder.Entity<User>().HasMany(m => m.Searches).WithRequired().HasForeignKey(m => m.UserId).WillCascadeOnDelete(false);
modelBuilder.Entity<User>().HasMany(m => m.Charges).WithRequired().HasForeignKey(m => m.UserId).WillCascadeOnDelete(false);
modelBuilder.Entity<Attribute>().HasMany(m => m.Formulas).WithRequired().HasForeignKey(m => m.AttributeId).WillCascadeOnDelete(false);
modelBuilder.Entity<Answer>().HasMany(m => m.Formulas).WithRequired().HasForeignKey(m => m.AnswerId).WillCascadeOnDelete(false);
// Create our primary keys
modelBuilder.Entity<IdentityUserLogin>().HasKey(m => m.UserId);
modelBuilder.Entity<IdentityRole>().HasKey(m => m.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(m => new {m.RoleId, m.UserId});
modelBuilder.Entity<AttributeOperation>().HasKey(m => m.AttributeId);
modelBuilder.Entity<AttributeType>().HasKey(m => m.AttributeId);
modelBuilder.Entity<Scenario>().HasKey(m => m.AnswerId);
}
При запуске он корректно обновлял внешние ключи. Я мог видеть это:
public partial class DisableCascadeDelete : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers");
DropForeignKey("dbo.Images", "AnswerId", "dbo.Answers");
DropForeignKey("dbo.Answers", "QuestionId", "dbo.Questions");
DropForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria");
DropForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes");
DropForeignKey("dbo.ImageText", "ImageId", "dbo.Images");
DropForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Questions", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Charges", "UserId", "dbo.Users");
DropForeignKey("dbo.Searches", "UserId", "dbo.Users");
AddForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers", "Id");
AddForeignKey("dbo.Images", "AnswerId", "dbo.Answers", "Id");
AddForeignKey("dbo.Answers", "QuestionId", "dbo.Questions", "Id");
AddForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria", "Id");
AddForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes", "Id");
AddForeignKey("dbo.ImageText", "ImageId", "dbo.Images", "Id");
AddForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Questions", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations", "Id");
AddForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations", "Id");
AddForeignKey("dbo.Charges", "UserId", "dbo.Users", "Id");
AddForeignKey("dbo.Searches", "UserId", "dbo.Users", "Id");
}
public override void Down()
{
DropForeignKey("dbo.Searches", "UserId", "dbo.Users");
DropForeignKey("dbo.Charges", "UserId", "dbo.Users");
DropForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Questions", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.ImageText", "ImageId", "dbo.Images");
DropForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes");
DropForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria");
DropForeignKey("dbo.Answers", "QuestionId", "dbo.Questions");
DropForeignKey("dbo.Images", "AnswerId", "dbo.Answers");
DropForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers");
AddForeignKey("dbo.Searches", "UserId", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.Charges", "UserId", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations", "Id", cascadeDelete: true);
AddForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations", "Id", cascadeDelete: true);
AddForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Questions", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.ImageText", "ImageId", "dbo.Images", "Id", cascadeDelete: true);
AddForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes", "Id", cascadeDelete: true);
AddForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria", "Id", cascadeDelete: true);
AddForeignKey("dbo.Answers", "QuestionId", "dbo.Questions", "Id", cascadeDelete: true);
AddForeignKey("dbo.Images", "AnswerId", "dbo.Answers", "Id", cascadeDelete: true);
AddForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers", "Id", cascadeDelete: true);
}
}
То, что я видел, было правильно. Затем я создал новую миграцию после изменения моего DbContext back:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
// Table renames
modelBuilder.Entity<Criteria>().ToTable("Criteria");
modelBuilder.Entity<IdentityRole>().ToTable("Roles");
modelBuilder.Entity<IdentityUserRole>().ToTable("UserRoles");
modelBuilder.Entity<IdentityUserClaim>().ToTable("UserClaims");
modelBuilder.Entity<IdentityUserLogin>().ToTable("UserLogins");
// One to One
modelBuilder.Entity<Attribute>().HasOptional(m => m.Type).WithRequired(m => m.Attribute).WillCascadeOnDelete(false);
modelBuilder.Entity<Attribute>().HasOptional(m => m.Operation).WithRequired(m => m.Attribute).WillCascadeOnDelete(false);
modelBuilder.Entity<Answer>().HasOptional(m => m.Scenario).WithRequired(m => m.Answer).WillCascadeOnDelete(false);
modelBuilder.Entity<Answer>().HasOptional(m => m.Criteria).WithMany().HasForeignKey(m => m.CriteriaId).WillCascadeOnDelete(false);
// One to Many
modelBuilder.Entity<Criteria>().HasMany(m => m.Attributes).WithRequired().HasForeignKey(m => m.CriteriaId).WillCascadeOnDelete(true);
modelBuilder.Entity<IdentityRole>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.RoleId).WillCascadeOnDelete(false);
modelBuilder.Entity<Organisation>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.OrganisationId).WillCascadeOnDelete(true);
modelBuilder.Entity<Organisation>().HasMany(m => m.Users).WithRequired().HasForeignKey(m => m.OrganisationId).WillCascadeOnDelete(true);
modelBuilder.Entity<Question>().HasMany(m => m.Answers).WithRequired(m => m.Question).HasForeignKey(m => m.QuestionId).WillCascadeOnDelete(true);
modelBuilder.Entity<Category>().HasMany(m => m.Sortations).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(true);
modelBuilder.Entity<Category>().HasMany(m => m.Criteria).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(true);
modelBuilder.Entity<Category>().HasMany(m => m.Feeds).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(true);
modelBuilder.Entity<Category>().HasMany(m => m.Questions).WithOptional().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(true);
modelBuilder.Entity<Category>().HasMany(m => m.Quotes).WithRequired().HasForeignKey(m => m.CategoryId).WillCascadeOnDelete(true);
modelBuilder.Entity<User>().HasMany(m => m.Searches).WithRequired().HasForeignKey(m => m.UserId).WillCascadeOnDelete(true);
modelBuilder.Entity<User>().HasMany(m => m.Charges).WithRequired().HasForeignKey(m => m.UserId).WillCascadeOnDelete(true);
modelBuilder.Entity<Attribute>().HasMany(m => m.Formulas).WithRequired().HasForeignKey(m => m.AttributeId).WillCascadeOnDelete(true);
modelBuilder.Entity<Answer>().HasMany(m => m.Formulas).WithRequired().HasForeignKey(m => m.AnswerId).WillCascadeOnDelete(true);
// Create our primary keys
modelBuilder.Entity<IdentityUserLogin>().HasKey(m => m.UserId);
modelBuilder.Entity<IdentityRole>().HasKey(m => m.Id);
modelBuilder.Entity<IdentityUserRole>().HasKey(m => new {m.RoleId, m.UserId});
modelBuilder.Entity<AttributeOperation>().HasKey(m => m.AttributeId);
modelBuilder.Entity<AttributeType>().HasKey(m => m.AttributeId);
modelBuilder.Entity<Scenario>().HasKey(m => m.AnswerId);
}
Который породил это:
public partial class EnableCascadeDelete : DbMigration
{
public override void Up()
{
DropForeignKey("dbo.ImageText", "ImageId", "dbo.Images");
DropForeignKey("dbo.Images", "AnswerId", "dbo.Answers");
DropForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers");
DropForeignKey("dbo.Answers", "QuestionId", "dbo.Questions");
DropForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria");
DropForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes");
DropForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Questions", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Charges", "UserId", "dbo.Users");
DropForeignKey("dbo.Searches", "UserId", "dbo.Users");
DropIndex("dbo.Images", new[] { "AnswerId" });
DropIndex("dbo.ImageText", new[] { "ImageId" });
AddForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers", "Id", cascadeDelete: true);
AddForeignKey("dbo.Answers", "QuestionId", "dbo.Questions", "Id", cascadeDelete: true);
AddForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria", "Id", cascadeDelete: true);
AddForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes", "Id", cascadeDelete: true);
AddForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Questions", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories", "Id", cascadeDelete: true);
AddForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations", "Id", cascadeDelete: true);
AddForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations", "Id", cascadeDelete: true);
AddForeignKey("dbo.Charges", "UserId", "dbo.Users", "Id", cascadeDelete: true);
AddForeignKey("dbo.Searches", "UserId", "dbo.Users", "Id", cascadeDelete: true);
DropTable("dbo.ImageText");
DropTable("dbo.Images");
}
public override void Down()
{
CreateTable(
"dbo.ImageText",
c => new
{
Id = c.Int(nullable: false, identity: true),
ImageId = c.Int(nullable: false),
Text = c.String(),
Delay = c.Int(nullable: false),
})
.PrimaryKey(t => t.Id);
CreateTable(
"dbo.Images",
c => new
{
Id = c.Int(nullable: false, identity: true),
AnswerId = c.Int(nullable: false),
Url = c.String(),
})
.PrimaryKey(t => t.Id);
DropForeignKey("dbo.Searches", "UserId", "dbo.Users");
DropForeignKey("dbo.Charges", "UserId", "dbo.Users");
DropForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations");
DropForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Questions", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories");
DropForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes");
DropForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria");
DropForeignKey("dbo.Answers", "QuestionId", "dbo.Questions");
DropForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers");
CreateIndex("dbo.ImageText", "ImageId");
CreateIndex("dbo.Images", "AnswerId");
AddForeignKey("dbo.Searches", "UserId", "dbo.Users", "Id");
AddForeignKey("dbo.Charges", "UserId", "dbo.Users", "Id");
AddForeignKey("dbo.Users", "OrganisationId", "dbo.Organisations", "Id");
AddForeignKey("dbo.Feeds", "OrganisationId", "dbo.Organisations", "Id");
AddForeignKey("dbo.Sortations", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Quotes", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Questions", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Feeds", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.Criteria", "CategoryId", "dbo.Categories", "Id");
AddForeignKey("dbo.AttributeFormulas", "AttributeId", "dbo.Attributes", "Id");
AddForeignKey("dbo.Attributes", "CriteriaId", "dbo.Criteria", "Id");
AddForeignKey("dbo.Answers", "QuestionId", "dbo.Questions", "Id");
AddForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers", "Id");
AddForeignKey("dbo.Images", "AnswerId", "dbo.Answers", "Id");
AddForeignKey("dbo.ImageText", "ImageId", "dbo.Images", "Id");
}
}
Как видите, каждый внешний ключ теперь имеет:
AddForeignKey("dbo.AnswerFormulas", "AnswerId", "dbo.Answers", "Id", cascadeDelete: true);
Таким образом, он явно устанавливает параметр cascadeDelete
, которого никогда не было.
Итак, что я делаю вывод?
Похоже, что при первоначальной настройке кода базы данных вы не можете и не должны полагаться на EntityFramework для создания каскадного удаления. Если вы хотите, вам нужно указать это при создании. Это должно предотвратить мою проблему с вами.
Но если это произойдет, просто отключите его и включите снова при следующей миграции, и это решит вашу проблему.