Tôi đã vật lộn với điều này trong một thời gian và không thể hiểu được chuyện gì đang xảy ra. Tôi có một thực thể Thẻ chứa các Bên (thường là 2) - và cả Thẻ và Bên đều có Giai đoạn. Tôi đang sử dụng di chuyển Codefirst của EF và việc di chuyển không thành công với lỗi này:
Giới thiệu ràng buộc FOREIGN KEY 'FK_dbo.Sides_dbo.Cards_CardId' trên bảng 'Sides' có thể gây ra chu kỳ hoặc nhiều đường dẫn tầng. Chỉ định TRÊN XÓA KHÔNG CÓ HÀNH ĐỘNG hoặc CẬP NHẬT KHÔNG CÓ HÀNH ĐỘNG, hoặc sửa đổi các ràng buộc khác NGOẠI TỪ.
Đây là thực thể Thẻ của tôi :
public class Card
{
public Card()
{
Sides = new Collection<Side>();
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int CardId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
[ForeignKey("CardId")]
public virtual ICollection<Side> Sides { get; set; }
}
Đây là thực thể phụ của tôi :
public class Side
{
public Side()
{
Stage = Stage.ONE;
}
[Key]
[Required]
public virtual int SideId { get; set; }
[Required]
public virtual Stage Stage { get; set; }
[Required]
public int CardId { get; set; }
[ForeignKey("CardId")]
public virtual Card Card { get; set; }
}
Và đây là thực thể Giai đoạn của tôi :
public class Stage
{
// Zero
public static readonly Stage ONE = new Stage(new TimeSpan(0, 0, 0), "ONE");
// Ten seconds
public static readonly Stage TWO = new Stage(new TimeSpan(0, 0, 10), "TWO");
public static IEnumerable<Stage> Values
{
get
{
yield return ONE;
yield return TWO;
}
}
public int StageId { get; set; }
private readonly TimeSpan span;
public string Title { get; set; }
Stage(TimeSpan span, string title)
{
this.span = span;
this.Title = title;
}
public TimeSpan Span { get { return span; } }
}
Điều kỳ lạ là nếu tôi thêm phần sau vào lớp Giai đoạn của mình:
public int? SideId { get; set; }
[ForeignKey("SideId")]
public virtual Side Side { get; set; }
Việc di chuyển chạy thành công. Nếu tôi mở SSMS và nhìn vào các bảng, tôi có thể thấy rằng nó Stage_StageId
đã được thêm vào Cards
(như mong đợi / mong muốn), tuy nhiên Sides
không có tham chiếu đếnStage
(không mong đợi).
Nếu tôi sau đó thêm
[Required]
[ForeignKey("StageId")]
public virtual Stage Stage { get; set; }
public int StageId { get; set; }
Đến lớp Side của tôi, tôi thấy StageId
cột được thêm vàoSide
bảng .
Điều này đang hoạt động, nhưng bây giờ trong suốt ứng dụng của tôi, bất kỳ tài liệu tham khảo nào Stage
có chứa một SideId
, trong một số trường hợp hoàn toàn không liên quan. Tôi muốn chỉ cung cấp cho tôi Card
và Side
các thực thể một thuộc Stage
tính dựa trên lớp Giai đoạn trên mà không làm ô nhiễm lớp giai đoạn với các thuộc tính tham chiếu nếu có thể ... tôi đang làm gì sai?
DeleteBehavior.Restrict
hoặc DeleteBehavior.SetNull
.
Side
Class thêm số nguyên Nullable và xóa[Required]
thuộc tính =>public int? CardId { get; set; }