[英]Error: Introducing FOREIGN KEY constraint may cause cycles or multiple cascade paths - why?
[英]Introducing Foreign Key Constraint may cause cycles or multiple cascade paths when property is not required
我收到此錯誤:
在表'STCIProductInteractiveInfoes'上引入FOREIGN KEY約束'FK_dbo.STCIProductInteractiveInfoes_dbo.User_ModifyUserID'可能會導致循環或多個級聯路徑。 指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
因此,我在線上(在stackoverflow上)進行了查詢,發現這可能是因為需要外鍵。 我注釋掉了必需的屬性,但仍然出現此錯誤。
這是我的課:
namespace PTEManager.Domain
{
public class PTEInteractiveCourse
{
[Key]
public Guid PTEInteractiveCourseId { get; set; }
[ScaffoldColumn(false)]
[Required]
public DateTime ModifyDate { get; set; }
[ScaffoldColumn(false)]
[ForeignKey("ModifyUser")]
//[Required]
public int ModifyUserId { get; set; }
public virtual OpsUser ModifyUser { get; set; }
[Display(Name = "Package")]
[Required]
public int PackageId { get; set; }
[ScaffoldColumn(false)]
[Display(Name = "")]
[Required]
public int Status { get; set; }
[Display(Name = "STCI Course")]
[ForeignKey("STCICourseID")]
[Required]
public Guid STCIProductInteractiveInfoID { get; set; }
public virtual STCIProductInteractiveInfo STCICourseID { get; set; }
}
}
這是它崩潰的代碼:
[HttpGet]
public ActionResult Index()
{
var model = db.PTEInteractiveCourses
.Where(p => p.Status == 1)
.ToList();
return View(model);
}
當用戶刪除交互式課程時,不應從用戶表中刪除該用戶。 只是互動課程應該被刪除。 在LINQ查詢上會發生哪個錯誤以列出數據,所以我什至不知道要刪除它有什么關系,無論如何我們都不會添加刪除功能。 好吧,將會有一個刪除,但是它所要做的就是向用戶隱藏交互過程,但是它將保存數據以防止數據丟失。
我找到了以下代碼:
protected override void OnModelCreating( DbModelBuilder modelBuilder )
{
modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();
}
從理論上講這應該可行,因為我不需要此項目的任何級聯刪除,但是我將把這些代碼放在哪里? 它在我的datacontext類中說,但是當我這樣做時,void關鍵字上出現構建錯誤。 這是我的datacontext類:
namespace PTEManager.Domain.Data
{
public class DataContext : DbContext, IDataContext
{
public DataContext()
: base("HelpDesk")
{
}
//public DataContext(DbConnection existingConnection, bool contextOwnsConnection)
// : base(existingConnection, contextOwnsConnection)
//{
//}
/// <summary>
/// any entity to be persisted must be declared here.
/// </summary>
///
public DbSet<OpsUser> OpsUsers { get; set; }
public DbSet<PTEInteractiveCourse> PTEInteractiveCourses { get; set; }
public DbSet<PTETrackingClass> PTETrackingClasses { get; set; }
public DbSet<STCIProductInteractiveInfo> STCIProductInteractiveInfos { get; set; }
}
}
OpsUser類別:
namespace PTEManager.Domain
{
[Table("User")]
public class OpsUser
{
[Key]
public int u_user_id { get; set; }
public Guid DepartmentID { get; set; }
[MaxLength(50)]
[Required]
public string email_addr { get; set; }
[MaxLength(30)]
[Required]
public string first_nme { get; set; }
[MaxLength(30)]
[Required]
public string last_nme { get; set; }
[Required]
public Guid msrepl_tran_version { get; set; }
[MaxLength(1)]
[Required]
public string status { get; set; }
[MaxLength(15)]
[Required]
public string user_nme { get; set; }
[Required]
public int u_branch_id { get; set; }
}
}
PTETrackingClass:
namespace PTEManager.Domain
{
public class PTETrackingClass
{
[Key]
public Guid PTETrackingClassId { get; set; }
[ScaffoldColumn(false)]
[Required]
public DateTime ModifyDate { get; set; }
[ScaffoldColumn(false)]
[ForeignKey("ModifyUser")]
[Required]
public int ModifyUserId { get; set; }
public virtual OpsUser ModifyUser { get; set; }
[Display(Name = "Extensions Allowed")]
[Required]
public int NumberOfExtensions { get; set; }
[ScaffoldColumn(false)]
[Required]
public int Status { get; set; }
[Display(Name="Tracking Class Code")]
[Required]
public Guid TrackingClassCode { get; set; }
}
}
STCIProductInteractiveInfo:
namespace PTEManager.Domain
{
public class STCIProductInteractiveInfo
{
[Key]
public Guid STCIProductInteractiveInfoID { get; set; }
public Guid MarketingTextID { get; set; }
[Required]
public DateTime ModifyDate { get; set; }
[ForeignKey("ModifyUser")]
//[Required]
public int ModifyUserID { get; set; }
public virtual OpsUser ModifyUser { get; set; }
[MaxLength(50)]
[Required]
public string STCICourseID { get; set; }
[MaxLength(100)]
[Required]
public string STCICourseName { get; set; }
public byte STCIProductEmailHTML { get; set; }
[MaxLength(255)]
public string STCIProductEmailHTMLDateType { get; set; }
public int STCIProductEmailHTMLFileLength { get; set; }
public byte STCIProductEmailText { get; set; }
[MaxLength(255)]
public string STCIProductEmailTextDataType { get; set; }
public string STCIProductEmailTextFileLength { get; set; }
[MaxLength(50)]
[Required]
public string STCITrackingClassCode { get; set; }
[MaxLength(100)]
[Required]
public string STCITrackingClassName { get; set; }
[Required]
public int u_product_id { get; set; }
}
}
您的表上有一個循環關系,以解決必須選擇的問題:
1)如果用戶在STCIProductInteractiveInfo
或PTEInteractiveCourse
是可選的, STCIProductInteractiveInfo
只需更改
public class STCIProductInteractiveInfo // or PTEInteractiveCourse
{
[Required]
public int ModifyUserID { get; set; }
}
至
public class STCIProductInteractiveInfo // or PTEInteractiveCourse
{
// [Required] remove required attribute too
public int? ModifyUserID { get; set; }
}
2)但是如果您想保留User Required
只需在DbContext上添加它即可
public class DataContext : DbContext, IDataContext
{
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<STCIProductInteractiveInfo>()
.HasRequired(e => e.ModifyUser)
.WithMany()
.WillCascadeOnDelete(false);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.