Creating ForeignKey

0

Well, in my project I decided to use some Foreign Keys. And after you end up getting this error:

  

{"The INSERT statement conflicted with the FOREIGN KEY constraint \" FK_dbo.Setors_dbo.Areas_setorAreas \ ". The conflict occurred in database \" RamalAguia.Models.RamaDb \ ", table \" dbo.Areas \ ", column ' areaID '. \ r \ nThe statement has been terminated. "}

I noticed that in my Table there was a Foreign Key that I was not creating that had no relation to my current project. But so far so good, the problem was that even after updating the database and deleting this FK every time I ran my project it reappeared.

My Models

Sector

public class Setor
{
    [Key, Column(Order =1 )]
    public int setorID { get; set; }

    public string setorName { get; set; }

    [ForeignKey("Area"), Column(Order = 3)]
    public int areaID { get; set; }

    public Area Area { get; set; }

    //[ForeignKey("SetorId")]
    //public ICollection<RamalModel> RamalModel { get; set; }
}

Table of the Sector model

   CREATE TABLE [dbo].[Setors] (
   [setorID]   INT            IDENTITY (1, 1) NOT NULL,
   [areaID]    INT            NOT NULL,
   [setorName] NVARCHAR (MAX) NULL,
   CONSTRAINT [PK_dbo.Setors] PRIMARY KEY CLUSTERED ([setorID] ASC),
   //Essa linha de baixo cria um FK que eu não peço onde eu não tenho esse "setorAreas"
   CONSTRAINT [FK_dbo.Setors_dbo.Areas_setorAreas] FOREIGN KEY ([areaID])     REFERENCES [dbo].[Areas] ([areaID]) ON DELETE CASCADE,
   CONSTRAINT [FK_dbo.Setors_dbo.Areas_areas_areaID] FOREIGN KEY ([areaID]) REFERENCES [dbo].[Areas] ([areaID])
   );

   GO
   CREATE NONCLUSTERED INDEX [IX_areaID]
   ON [dbo].[Setors]([areaID] ASC);

Area

  public class Area
{
    [Key, Column(Order=3)]
    public int areaID { get; set; }

    public string areaNome { get; set; }
}

Table of the Model Area

CREATE TABLE [dbo].[Areas] (
[areaID]   INT            IDENTITY (1, 1) NOT NULL,
[areaNome] NVARCHAR (MAX) NULL,
CONSTRAINT [PK_dbo.Areas] PRIMARY KEY CLUSTERED ([areaID] ASC)
);

Thank you in advance.

    
asked by anonymous 08.06.2016 / 18:43

1 answer

3

Several things wrong, and missing a few. I'll start with Setor :

[TableName("Setores")] // Use isto para definir corretamente o nome da tabela.
                       // A inflexão em inglês pluraliza errado o nome.
public class Setor
{
    // [Key, Column(Order =1 )]
    [Key] // Se não é chave composta, não use 'Column'.
    public int SetorId { get; set; } // Procure usar TypeCase, conforme a convenção do EF. Apenas primeiras letras de palavras são maiúsculas.
    // [ForeignKey("Area"), Column(Order = 3)]
    public int AreaID { get; set; } // [ForeignKey] não precisa ser usada aqui. O EF é capaz de deduzir a chave estrangeira sozinho.

    // public string setorName { get; set; }
    public string Name { get; set; } // Aqui não é exatamente um erro, mas não tem necessidade de você dizer que o Nome é do Setor.

    public virtual Area Area { get; set; } // Especifique virtual para apontar para o EF que é ele que deve preencher a propriedade.
}

And Area :

public class Area
{
    // [Key, Column(Order=3)]
    [Key] // Não use Column dentro de Key se a chave não for composta.
    public int AreaID { get; set; }

    public string Nome { get; set; }

    public virtual ICollection<Setor> Setores { get; set; } // A relação entre Setor e Area é de 1 para N, então você precisa dizer isso ao EF.
                                                            // Aqui é a origem do seu erro.

If you've done everything you've done, your tables will look like this:

CREATE TABLE [dbo].[Setores] (
    [SetorId]   INT            IDENTITY (1, 1) NOT NULL,
    [AreaId]    INT            NOT NULL,
    [Nome] NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.Setores] PRIMARY KEY CLUSTERED ([SetorId] ASC),
    CONSTRAINT [FK_dbo.Setores_dbo.Areas_Area_AreaId] FOREIGN KEY ([AreaId]) REFERENCES [dbo].[Areas] ([AreaId])
);

GO
CREATE NONCLUSTERED INDEX [IX_AreaId]
ON [dbo].[Setores]([AreaId] ASC);

CREATE TABLE [dbo].[Areas] (
    [AreaId]   INT            IDENTITY (1, 1) NOT NULL,
    [Nome] NVARCHAR (MAX) NULL,
    CONSTRAINT [PK_dbo.Areas] PRIMARY KEY CLUSTERED ([AreaId] ASC)
);
    
08.06.2016 / 21:28