【问题标题】:EF Core Sqlite - FOREIGN KEY constraint failed migration - not nullable to nullable foreign keyEF Core Sqlite - FOREIGN KEY 约束迁移失败 - 不可空到可空外键
【发布时间】:2021-10-27 05:39:37
【问题描述】:

我想将表上的外键从不可为空更改为可空

类名:DestinatairePartageDocument

public class DestinatairePartageDocument
{
    [Key]

    public int DestinatairePartageDocumentId { get; set; }

    //[ForeignKey("Document")]
    //public int DocumentId { get; set; }

    [ForeignKey("Document")]
    public int? DocumentId { get; set; }

    public Document Document { get; set; }

    //[ForeignKey("Examen")]
    [NotMapped]
    public int? ExamenId { get; set; }

    //public Examen Examen { get; set; }

    [ForeignKey("DestinatairePartage")]
    public int DestinatairePartageId { get; set; }

    public DestinatairePartage DestinatairePartage { get; set; }

    public string CodeAccesDocument { get; set; }

    public DateTime DateFinValiditeCodeAccesDocument { get; set; }

    public string TypePartage { get; set; } /* PartageClassique, PartageCodeGenere */

    public string StatutDocument { get; set; }

    public bool PartageActive { get; set; }

    public DateTime DateCreation { get; set; }

    public DateTime DateDerniereModification { get; set; }

}

旧属性设置:

    [ForeignKey("Document")]
    public int DocumentId { get; set; }

    public Document Document { get; set; }

新属性设置:

    [ForeignKey("Document")]
    public int? DocumentId { get; set; }

    public Document Document { get; set; }

进行此更新后,我会更新我的迁移架构:

dotnet ef Migrations add UpdateDocumentNullable

然后我将修改应用到数据库:

dotnet ef database update

但随后出现以下错误“FOREIGN KEY constraint failed”:

这是生成的迁移文件:

protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropForeignKey(
            name: "FK_DestinatairesPartageDocuments_Documents_DocumentId",
            table: "DestinatairesPartageDocuments");

        migrationBuilder.AddColumn<string>(
            name: "StatutPartageExamen",
            table: "Examens",
            type: "TEXT",
            nullable: true);

        migrationBuilder.AlterColumn<int>(
            name: "DocumentId",
            table: "DestinatairesPartageDocuments",
            type: "INTEGER",
            nullable: true,
            oldClrType: typeof(int),
            oldType: "INTEGER");

        migrationBuilder.AddColumn<int>(
            name: "ExamenId",
            table: "DestinatairesPartageDocuments",
            type: "INTEGER",
            nullable: true);

        migrationBuilder.AddForeignKey(
            name: "FK_DestinatairesPartageDocuments_Documents_DocumentId",
            table: "DestinatairesPartageDocuments",
            column: "DocumentId",
            principalTable: "Documents",
            principalColumn: "DocumentId",
            onDelete: ReferentialAction.Restrict);
    }

以下是迁移创建的查询:

我的 DbContext 类:

public class ApplicationDbContext: IdentityDbContext<ApplicationUser>, IDataProtectionKeyContext
{
    private readonly ILoggerFactory _loggerFactory;

    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options, ILoggerFactory loggerFactory) : base(options)
    {
        _loggerFactory = loggerFactory;
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        optionsBuilder.UseLoggerFactory(_loggerFactory);
    }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        base.OnModelCreating(modelBuilder);

        //modelBuilder.Entity<DestinatairePartageDocument>()
        //    .Property(dpd => dpd.DocumentId)
        //    .HasDefaultValueSql("NULL");

        //modelBuilder.Entity<DestinatairePartageDocument>()
        //    .HasOne(dpd => dpd.Document)
        //    .WithMany()
        //    .OnDelete(DeleteBehavior.Cascade);

        //modelBuilder.Entity<DestinatairePartageDocument>()
        //    .HasOne("PortailWorker.Models.Document", "Document")
        //    .WithMany()
        //    .HasForeignKey("DocumentId");

        modelBuilder.Entity<DestinatairePartageDocument>()
            .Property(ap => ap.DateCreation)
            .HasDefaultValueSql("CURRENT_TIMESTAMP");

        modelBuilder.Entity<DestinatairePartageDocument>()
            .Property(ap => ap.DateDerniereModification)
            .HasDefaultValueSql("CURRENT_TIMESTAMP");

        modelBuilder.Entity<Revendeur>()
            .HasMany(r => r.ListeClients)
            .WithOne(c => c.Revendeur);

        modelBuilder.Entity<ClientWPFFetcher>()
            .HasKey(cwf => new { cwf.ClientId, cwf.WPFFetcherId });

        modelBuilder.Entity<ClientWPFFetcher>()
            .Property(cwf => cwf.RelationActivated)
            .HasDefaultValue(true);

        modelBuilder.Entity<ClientWPFFetcher>()
            .HasOne(cwf => cwf.Client)
            .WithMany(c => c.ClientWPFFetchers)
            .HasForeignKey(cwl => cwl.ClientId);

        modelBuilder.Entity<ClientWPFFetcher>()
            .HasOne(cwf => cwf.WPFFetcher)
            .WithMany(c => c.ClientWPFFetchers)
            .HasForeignKey(cwl => cwl.WPFFetcherId);

        modelBuilder.Entity<ClientWorkerLocal>()
            .HasKey(cwl => new { cwl.ClientId, cwl.WorkerLocalId });  

        modelBuilder.Entity<ClientWorkerLocal>()
            .Property(cwl => cwl.RelationActivated)
            .HasDefaultValue(true);

        modelBuilder.Entity<ClientWorkerLocal>()
            .HasOne(cwl => cwl.Client)
            .WithMany(c => c.ClientWorkersLocal)
            .HasForeignKey(cwl => cwl.ClientId);  

        modelBuilder.Entity<ClientWorkerLocal>()
            .HasOne(cwl => cwl.WorkerLocal)
            .WithMany(c => c.ClientWorkersLocal)
            .HasForeignKey(cwl => cwl.WorkerLocalId);  

        modelBuilder.Entity<Client>()
            .Property(ap => ap.ActivationStatus)
            .HasDefaultValue(1);

        modelBuilder.Entity<Revendeur>()
            .Property(ap => ap.ActivationStatus)
            .HasDefaultValue(1);

        modelBuilder.Entity<WorkerLocal>()
            .Property(ap => ap.ActivationStatus)
            .HasDefaultValue(1);

        modelBuilder.Entity<ConfigurationWorker>()
            .Property(cw => cw.Jpeg2000LossyRate)
            .HasDefaultValue(40);

        modelBuilder.Entity<ConfigurationWorker>()
            .Property(cw => cw.ActiverBackgroundServiceWorker)
            .HasDefaultValue(true);

        modelBuilder.Entity<WorkerLocal>()
            .Property(ap => ap.EnLigne)
            .HasDefaultValue(false);

        modelBuilder.Entity<WorkerLocal>()
            .Property(ap => ap.UtilisationCPUPourcentage)
            .HasDefaultValue(0.00);

        modelBuilder.Entity<WorkerLocal>()
            .Property(ap => ap.UtilisationRAMPourcentage)
            .HasDefaultValue(0.00);

        modelBuilder.Entity<WorkerLocal>()
            .Property(ap => ap.UtilisationStockagePourcentage)
            .HasDefaultValue(0.00);

        modelBuilder.Entity<MappingHL7>()
            .Property(m => m.SegmentId)
            .HasDefaultValue(1);

        modelBuilder.Entity<MappingHL7>()
            .Property(m => m.ChampsHL7RepetitionId)
            .HasDefaultValue(1);

        modelBuilder.Entity<MappingHL7>()
            .Property(m => m.SousComposantHL7)
            .HasDefaultValue(1);

        modelBuilder.Entity<MappingHL7>()
            .Property(m => m.TypeMessage)
            .HasDefaultValue("Tous");
    }

    public DbSet<RegleTraitementImage> ReglesTraitementImage { get; set; }

    public DbSet<CritereSelectionRegle> CriteresSelectionRegle { get; set; }

    public DbSet<AETDemandeur> AETDemandeurs { get; set; }

    public DbSet<DestinatairePartageDocument> DestinatairesPartageDocuments { get; set; }

    public DbSet<WPFFetcher> WPFFetchers { get; set; }

    public DbSet<ClientWPFFetcher> ClientsWPFFetchers { get; set; }

    public DbSet<ExamenAEnvoyer> ExamensAEnvoyer { get; set; }

    public DbSet<ImageAEnvoyer> ImagesAEnvoyer { get; set; }

    public DbSet<WorkerLocal> WorkersLocal { get; set; }

    public DbSet<DestinationHL7> DestinationsHL7 { get; set; }

    public DbSet<MessageHL7> MessagesHL7 { get; set; }

    public DbSet<Patient> Patients { get; set; }

    public DbSet<Examen> Examens { get; set; }

    public DbSet<Medecin> Medecins { get; set; }

    public DbSet<Correspondant> Correspondants { get; set; }

    public DbSet<ExamensCorrespondants> ExamensCorrespondants { get; set; }

    public DbSet<MappingHL7> MappingHL7 { get; set; }

    public DbSet<ConfigurationWorker> ConfigurationWorker { get; set; }

    public DbSet<DocumentStatus> DocumentStatus { get; set; }

    public DbSet<Document> Documents { get; set; }       

    public DbSet<DocumentLogEvents> DocumentLogEvents { get; set; }

    public DbSet<DestinatairePartage> DestinatairesPartage { get; set; }

    public DbSet<Client> Clients { get; set; }

    public DbSet<Revendeur> Revendeurs { get; set; }

    public DbSet<ClientWorkerLocal> ClientWorkersLocal { get; set; }

    public DbSet<DataProtectionKey> DataProtectionKeys { get; set; }

    public DbSet<MappingExamenCompression> MappingExamenCompression { get; set; }
}

有谁知道如何防止这个错误发生?

我已尝试更改 onDelete 约束,但没有任何改变。

感谢您的帮助!

【问题讨论】:

  • 发布您的 Dbcontext 类代码。
  • @PritomSarkar 我用 DbContext 类代码编辑了我的帖子

标签: sqlite asp.net-core entity-framework-core asp.net-core-5.0


【解决方案1】:

清空表后一切正常。

我认为我之前的测试中的外键 id 在原始表中不再存在。

很抱歉打扰您!

【讨论】:

    猜你喜欢
    • 2020-10-18
    • 2023-03-22
    • 1970-01-01
    • 2017-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多