我遇到过循环引用不可避免的情况,我有三个模型类:教授,模块,元素:
我的模型类:
public class Professor{
public Professor(){
this.Modules = new HashSet<Module>();
this.Elements = new HashSet<Element>();
}
public int ProfessorID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
public DateTime DayOfBirth { get; set; }
public string Email { get; set; }
public string Password { get; set; }
public string PhoneNumber { get; set; }
public virtual ICollection<Module> Modules { get; set; }
public virtual ICollection<Element> Elements { get; set; }
}
public class Module {
public Module() {
this.ModuleElements = new HashSet<Element>();
}
public int ModuleID { get; set; }
public string Title { get; set; }
public virtual Professor ResponsibleProfessor { get; set; }
public int? ProfessorID { get; set; }
public virtual ICollection<Element> ModuleElements { get; set; }
}
public class Element {
public int ElementID { get; set; }
public string Title { get; set; }
public int? ProfessorID { get; set; }
public int ModuleID { get; set; }
public virtual Module Module { get; set; }
public virtual Professor Professor { get; set; }
}
我的DBContext:
public class GI3ASPDOTNETMVCENTITYContext : DbContext {
public GI3ASPDOTNETMVCENTITYContext() : base("name=GI3ASPDOTNETMVCENTITYContext"){}
public System.Data.Entity.DbSet<GI3ASPDOTNETMVCENTITY.Models.Student> Students { get; set; }
public System.Data.Entity.DbSet<GI3ASPDOTNETMVCENTITY.Models.Professor> Professors { get; set; }
public System.Data.Entity.DbSet<GI3ASPDOTNETMVCENTITY.Models.Module> Modules { get; set; }
public System.Data.Entity.DbSet<GI3ASPDOTNETMVCENTITY.Models.Element> Elements { get; set; }
protected override void OnModelCreating(DbModelBuilder modelBuilder){
base.OnModelCreating(modelBuilder);
modelBuilder.Entity<Module>().HasOptional(m => m.ResponsibleProfessor).WithMany(p => p.Modules).HasForeignKey(m => m.ProfessorID).WillCascadeOnDelete(false);
modelBuilder.Entity<Element>().HasRequired(e => e.Module).WithMany(m => m.ModuleElements).HasForeignKey(e => e.ModuleID).WillCascadeOnDelete(true);
modelBuilder.Entity<Element>().HasOptional(e => e.Professor).WithMany(p => p.Elements).HasForeignKey(e => e.ProfessorID).WillCascadeOnDelete(false);
modelBuilder.Entity<Professor>().HasMany(p => p.Elements).WithOptional(e => e.Professor).WillCascadeOnDelete(false);
modelBuilder.Entity<Professor>().HasMany(p => p.Modules).WithOptional(m => m.ResponsibleProfessor).WillCascadeOnDelete(false);
}
}
我已经在数据库中播放了样本数据,因此在尝试删除教授条目时,它停止说:
DELETE语句与REFERENCE约束冲突&#34; FK_dbo.Elements_dbo.Professors_ProfessorID&#34;。冲突发生在数据库&#34; GI3_1&#34;,table&#34; dbo.Elements&#34;,column&#39; ProfessorID&#39;中。 声明已经终止。
描述:执行期间发生了未处理的异常 当前的网络请求。请查看堆栈跟踪了解更多信息 有关错误的信息以及它在代码中的起源。
异常详细信息:System.Data.SqlClient.SqlException:DELETE 语句与REFERENCE约束冲突 &#34; FK_dbo.Elements_dbo.Professors_ProfessorID&#34 ;.冲突发生在 数据库&#34; GI3_1&#34;,表&#34; dbo.Elements&#34;,列&#39; ProfessorID&#39;。该 声明已被终止。
第113行:教授教授= db.Professors.Find(id); 第114行:db.Professors.Remove(教授);第115行:
db.SaveChanges();第116行:返回 RedirectToAction(&#34;指数&#34);第117行:}
答案 0 :(得分:1)
这取决于教授被删除时你想要发生什么。在你的情况下,我想它必须从相关的模块和元素中取消分配(而不是删除它们)。
不幸的是,由于您无法启用级联操作,您必须手动执行此操作:
Professor toBeDeleted = ...;
foreach (var module in db.Modules.Where(m => m.ProfessorID == toBeDeleted.ProfessorID))
module.ProfessorID = null;
foreach (var element in db.Elements.Where(e => e.ProfessorID == toBeDeleted.ProfessorID))
element.ProfessorID = null;
db.Professors.Remove(toBeDeleted);
db.SaveChanges();