Creation of Foreignkey

Asked

Viewed 259 times

0

Well, in my project I decided to use some Foreign Keys. And after 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 realized that in my Table appeared a Foreign Key that I was not creating and 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 model Sector

   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.

1 answer

3


Several things wrong, and some missing. 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 I’ve been through, 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)
);

Browser other questions tagged

You are not signed in. Login or sign up in order to post.