由于多个外键约束,创建 ASP.NET 迁移时出错

问题描述 投票:0回答:1

我在为 ASP.NET 项目创建初始迁移时遇到问题。定义模型和数据注释后,尝试创建数据库时,我在 NuGet 控制台中遇到以下错误:

Failed executing DbCommand (7ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [FCT] (
    [IdFCT] int NOT NULL IDENTITY,
    [AlunoIdAluno] int NOT NULL,
    [EmpresaIdEmpresa] int NOT NULL,
    [InstituicaoEnsinoIdInstituicao] int NOT NULL,
    [DataInicioFCT] datetime2 NOT NULL,
    [DataFimFCT] datetime2 NOT NULL,
    [PeriodoFCTIdPeriodo] int NOT NULL,
    [AvaliacaoIdAvaliacao] int NOT NULL,
    [DocumentosIdDocumento] int NOT NULL,
    CONSTRAINT [PK_FCT] PRIMARY KEY ([IdFCT]),
    CONSTRAINT [FK_FCT_Alunos_AlunoIdAluno] FOREIGN KEY ([AlunoIdAluno]) REFERENCES [Alunos] ([IdAluno]) ON DELETE CASCADE,
    CONSTRAINT [FK_FCT_Avaliacao_AvaliacaoIdAvaliacao] FOREIGN KEY ([AvaliacaoIdAvaliacao]) REFERENCES [Avaliacao] ([IdAvaliacao]) ON DELETE CASCADE,
    CONSTRAINT [FK_FCT_Documentos_DocumentosIdDocumento] FOREIGN KEY ([DocumentosIdDocumento]) REFERENCES [Documentos] ([IdDocumento]) ON DELETE CASCADE,
    CONSTRAINT [FK_FCT_Empresa_EmpresaIdEmpresa] FOREIGN KEY ([EmpresaIdEmpresa]) REFERENCES [Empresa] ([IdEmpresa]) ON DELETE CASCADE,
    CONSTRAINT [FK_FCT_InstituicaoEnsino_InstituicaoEnsinoIdInstituicao] FOREIGN KEY ([InstituicaoEnsinoIdInstituicao]) REFERENCES [InstituicaoEnsino] ([IdInstituicao]) ON DELETE CASCADE,
    CONSTRAINT [FK_FCT_PeriodoFCT_PeriodoFCTIdPeriodo] FOREIGN KEY ([PeriodoFCTIdPeriodo]) REFERENCES [PeriodoFCT] ([IdPeriodo]) ON DELETE CASCADE

Introducing FOREIGN KEY constraint 'FK_FCT_InstituicaoEnsino_InstituicaoEnsinoIdInstituicao' on table 'FCT' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.
Could not create constraint or index. See previous errors.

这是我的模型(我认为导致问题的模型):

using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FCTConnect.Models
{
    public class FCT
    {
        [Key]
        public int IdFCT { get; set; }

        public Aluno Aluno { get; set; }

        public Empresa Empresa { get; set; }

        public InstituicaoEnsino InstituicaoEnsino { get; set; }

        [Required]
        [DataType(DataType.Date)]
        public DateTime DataInicioFCT { get; set; }

        [Required]
        [DataType(DataType.Date)]
        public DateTime DataFimFCT { get; set; }

        public PeriodoFCT PeriodoFCT { get; set; }

        public Avaliacao Avaliacao { get; set; }

        public Documentos Documentos { get; set; }
    }
}
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace FCTConnect.Models
{
    public class Aluno
    {
        [Key]
        public int IdAluno { get; set; }

        [Required]
        [StringLength(100)]
        public string Nome { get; set; }

        [Required]
        public int Idade { get; set; }

        [Required]
        [StringLength(100)]
        public string Curso { get; set; }

        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [Phone]
        public string Telefone { get; set; }

        [Required]
        [StringLength(100)]
        public string Morada { get; set; }

        public InstituicaoEnsino InstituicaoEnsino { get; set; }
    }
}
using System.ComponentModel.DataAnnotations;

namespace FCTConnect.Models
{
    public class InstituicaoEnsino
    {
        [Key]
        public int IdInstituicao { get; set; }

        [Required]
        [StringLength(100)]
        public string Nome { get; set; }

        [Required]
        [StringLength(100)]
        public string Morada { get; set; }

        [Required]
        [EmailAddress]
        public string Email { get; set; }

        [Required]
        [Phone]
        public string Telefone { get; set; }

        [Required]
        [StringLength(500)]
        public string Descricao { get; set; }
    }
}

在前一阶段,我绘制了以下 E-R 图:

e-r图

我的项目正在 Visual Studio 中使用 SQL Server 进行开发。

我很感激任何可以提供帮助的人。

我尝试指定“ON DELETE NO ACTION”或“ON UPDATE NO ACTION”,但没有成功。 我尝试过定义外键而不是直接声明类,但我认为直接声明类在程序开发中会更有优势。

c# asp.net .net database nuget
1个回答
0
投票

我注意到你的代码中有这个类:

public class FCT
{
    [Key]
    public int IdFCT { get; set; }

    public Aluno Aluno { get; set; }

    public Empresa Empresa { get; set; }

    public InstituicaoEnsino InstituicaoEnsino { get; set; }

    [Required]
    [DataType(DataType.Date)]
    public DateTime DataInicioFCT { get; set; }

    [Required]
    [DataType(DataType.Date)]
    public DateTime DataFimFCT { get; set; }

    public PeriodoFCT PeriodoFCT { get; set; }

    public Avaliacao Avaliacao { get; set; }

    public Documentos Documentos { get; set; }
}

这里你已经调用了 public Aluno Aluno 是这段代码,但是你应该有外键来引用 Aluno 类的主要代码,并且与 InstituicaoEnsino 类相同。所以也许错误可能是因为你需要这样的代码:

    public int IdAluno { get; set; }
    
    [ForeignKey("IdAluno")]
    public Aluno Aluno { get; set; }

    public int IdInstituicao { get; set; }
    
    [ForeignKey("IdInstituicao")]
    public InstituicaoEnsino InstituicaoEnsino { get; set; }

尝试将外键添加到您创建的各个表中。看看这是否有效。如果没有,请提供有关您有哪些课程以及您有哪些桌子的更多信息。要理解,请尝试调试初始化模型的位置,并查看是否获得任何空值。

© www.soinside.com 2019 - 2024. All rights reserved.