Entity Framework 7에서 ON DELETE NO ACTION을 지정 하시겠습니까?

entity-framework-core

문제

Entity Framework 7에서 마이그레이션을 적용하려고 할 때 오류가 발생합니다.

FOREIGN KEY 제약 조건 'FK_ChangeOrder_User_CreatedByID'를 'ChangeOrder'테이블에 도입하면 사이클 또는 여러 개의 계단식 경로가 발생할 수 있습니다. NO DELETE NO ACTION 또는 UP UP NO NO ACTION을 지정하거나 다른 FOREIGN KEY 제약 조건을 수정하십시오.
제약 조건을 만들 수 없습니다. 이전 오류를 참조하십시오.

이전 버전의 Entity Framework에서이 기능을 추가하여

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>();

DbContext에 있지만 EF7에 modelBuilder 이하지 않는 것 .Conventions 그것과 구글은 구형 EF 4 개하지만 EF (6) 결과를 반환한다.

Entity Framework 7에서 ON DELETE NO ACTION 제약 조건을 어떻게 구체화합니까?

편집 : Oleg에 의해 제공된 대답은 외래 키마다 분명히 할 것입니다.하지만이 코드를 전역 적으로 선언 한 다음 코드 한 줄을 사용하여 훨씬 쉽게 코드를 지정할 수 있으므로 전역 적으로 수행하려고합니다. 수백 명의 관계가 끝나게 될 것입니다.

편집 2 : Oleg 용 코드

public class ChangeOrder
{
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int ID { get; set; }

    public Int16? ApprovedByID { get; set; }
    public Byte ApprovalStatusID { get; set; }
    public Int16 AssignedToID { get; set; }
    public Int16 CreatedByID { get; set; }
    public Byte CurrentStatusID { get; set; }
    public DateTime? DateApproved { get; set; }
    public DateTime? EndDate { get; set; }
    public Byte ImpactID { get; set; }
    public Byte PriorityID { get; set; }
    public DateTime? StartDate { get; set; }
    public Byte TypeID { get; set; }

    [Required]
    public string Name { get; set; }

    [Required]
    public string ReasonForChange { get; set; }

    [ForeignKey("ApprovedByID")]
    public User ApprovedBy { get; set; }

    [ForeignKey("ApprovalStatusID")]
    public ChangeApprovalStatus ApprovalStatus { get; set; }

    [ForeignKey("AssignedToID")]
    public User AssignedTo { get; set; }

    [ForeignKey("CreatedByID")]
    public User CreatedBy { get; set; }

    [ForeignKey("ImpactID")]
    public ChangeImpact Impact { get; set; }

    [ForeignKey("PriorityID")]
    public ChangePriority Priority { get; set; }

    [ForeignKey("TypeID")]
    public ChangeType ChangeType { get; set; }

    [ForeignKey("CurrentStatusID")]
    public ChangeStatus CurrentStatus { get; set; }
}
public class JobSightDBContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelbuilder)
    {
        base.OnModelCreating(modelbuilder);
    }

    DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; }
    DbSet<ChangeImpact> ChangeImapct { get; set; }
    DbSet<ChangeOrder> ChangeOrders { get; set; }
    DbSet<ChangePriority> ChangePriorities { get; set; }
    DbSet<ChangeStatus> ChangeStatus { get; set; }
    DbSet<ChangeType> ChangeTypes { get; set; }
    DbSet<User> Users { get; set; }
}

수락 된 답변

GitHub을 파고 MS의 환자 인력으로 작업 한 후 현재 솔루션은 DbContext에이를 추가하는 것입니다.

protected override void OnModelCreating(ModelBuilder modelbuilder)
{
    foreach (var relationship in modelbuilder.Model.GetEntityTypes().SelectMany(e => e.GetForeignKeys()))
    {
        relationship.DeleteBehavior = DeleteBehavior.Restrict;
    }

    base.OnModelCreating(modelbuilder);
}

인기 답변

건설

modelBuilder.Entity("myNamespace.Models.ChangeOrder", b =>
    {
        b.HasOne("myNamespace.Models.User")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade);
    });

REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE 하여 FK_ChangeOrder_User_CreatedByID 를 만드는 것을 의미합니다 REFERENCES [dbo].[User] ([CreatedByID]) ON DELETE CASCADE . 마이그레이션 중에 작성된 protected override void BuildModel(ModelBuilder modelBuilder)YourContextModelSnapshot.cs 합니다. 내가 충분히 당신의 질문을 이해하고 있는지 모르겠지만, 당신은 XXXModelSnapshot.cs 에 그러한 구조를 추가하거나 이미 존재하는 불필요한 구조를 제거해야한다고 생각합니다.

업데이트 : 모델에 문제가 있음을 확인했습니다. 다음과 같은 속성이 있습니다.

public Int16? ApprovedByID { get; set; }
public Int16 AssignedToID { get; set; }
public Int16 CreatedByID { get; set; }

// navigation properties

[ForeignKey("ApprovedByID")]
public User ApprovedBy { get; set; }

[ForeignKey("AssignedToID")]
public User AssignedTo { get; set; }

[ForeignKey("CreatedByID")]
public User CreatedBy { get; set; }

기본적으로 마이그레이션은 모든 속성에서 DeleteBehavior.Cascade 를 설정하려고 시도합니다.

당신은 변경하여 동작을 덮어 쓸 수 있습니다 OnModelCreating 중 하나를 설정하고, DeleteBehavior.Restrict 모든 키에 대한 행동이나 단지 키를 한 번에 설정할 수 DeleteBehavior.Cascade 또는 DeleteBehavior.SetNull 동작을. 예를 들어, 아래 코드는 DeleteBehavior.CascadeCreatedByID (외래 키에 ON DELETE CASCADE 를 작성)에서 사용하고 다른 외래 키 (외래 키에서 ON DELETE 는 없음)에서 DeleteBehavior.Restrict 를 사용합니다.

public class JobSightDBContext : DbContext
{
    protected override void OnModelCreating(ModelBuilder modelbuilder)
    {
        base.OnModelCreating(modelbuilder);

        modelbuilder.Entity(typeof (ChangeOrder))
            .HasOne(typeof (User), "ApprovedBy")
            .WithMany()
            .HasForeignKey("ApprovedByID")
            .OnDelete(DeleteBehavior.Restrict); // no ON DELETE
        modelbuilder.Entity(typeof (ChangeOrder))
            .HasOne(typeof (User), "AssignedTo")
            .WithMany()
            .HasForeignKey("AssignedToID")
            .OnDelete(DeleteBehavior.Restrict); // no ON DELETE
        modelbuilder.Entity(typeof (ChangeOrder))
            .HasOne(typeof (User), "CreatedBy")
            .WithMany()
            .HasForeignKey("CreatedByID")
            .OnDelete(DeleteBehavior.Cascade); // set ON DELETE CASCADE
    }

    DbSet<ChangeApprovalStatus> ChangeApprovalStatus { get; set; }
    DbSet<ChangeImpact> ChangeImapct { get; set; }
    DbSet<ChangeOrder> ChangeOrders { get; set; }
    DbSet<ChangePriority> ChangePriorities { get; set; }
    DbSet<ChangeStatus> ChangeStatus { get; set; }
    DbSet<ChangeType> ChangeTypes { get; set; }
    DbSet<User> Users { get; set; }
}



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.