1

Quand je veux créer ou ajouter des données dans la base de données, je reçois cette erreur:L'instruction INSERT en conflit avec la contrainte FOREIGN KEY ... Dans Entity Framework

System.Data.SqlClient.SqlException:
The INSERT statement conflicted with the FOREIGN KEY constraint "FK_dbo.CompanyProfiles_dbo.Users_Id". The conflict occurred in database "AppDb", table "dbo.Users", column 'Id'. The statement has been terminated.

J'ai une à une relation entre User et CompanyProfile.

User.cs

public class User : IdentityUser<Guid, UserLogin, UserRole, UserClaim> 
{ 
    ... 
    // navigation properties 
    public virtual CompanyProfile CompanyProfile { get; set; } 
} 

CompanyProfile.cs

public class CompanyProfile 
{ 
    ... 
    // navigation property 
    public User User { get; set; } 
    public Guid UserId { get; set; } 
} 

CompanyProfileConfig.cs

public class CompanyProfileConfig : EntityTypeConfiguration<CompanyProfile> 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="CompanyProfileConfig"/> class. 
    /// </summary> 
    public CompanyProfileConfig() 
    { 
     this.HasKey(_ => _.Id); 

     ... 

     this.HasRequired(_ => _.User) 
      .WithOptional(_ => _.CompanyProfile); 

    } 
} 

aussi je reçois cette requête dans SQL Server Profiler:

INSERT[dbo].[CompanyProfiles] ([Id], [CompanyName], [Activity],[Description], 
           [WebSite], [Phone], [UserId], [Address]) 
VALUES('aee90a37-425a-4a2c-a3df-2c2c95ad954c' /* @0 - [Id] */, 
     'My Company' /* @1 - [CompanyName] */, 
     'Programmer' /* @2 - [Activity] */, 
     'MyDescription' /* @3 - [Description] */, 
     'http://example.com' /* @4 - [WebSite] */, 
     '66663369' /* @5 - [Phone] */, 
     '2f4e0f48-b7e3-4bfb-98fe-69daa1cb501a' /* @6 - [UserId] */, 
     'MyAddress' /* @7 - [Address] */) 

Mon poste ActionResult:

public virtual async Task<ActionResult> CreateProfile(CompanyProfileViewModel viewModel) 
    { 
     viewModel.UserId = new Guid(_identity.GetUserId()); 

     if (ModelState.IsValid) 
     { 
      _companyProfileService.Create(viewModel); 
      await _uow.SaveAllChangesAsync(); 
     } 

     return View(MVC.Company.Profile.ActionNames.CreateProfile,viewModel); 
    } 

capture d'écran de table CompanyProfile:

enter image description here

+0

pouvez-vous afficher le code où vous essayez d'ajouter? ..cause il semble que EF est tryng pour ajouter aussi un nouvel utilisateur (même si c'est déjà existant) ou peut-être l'utilisateur que vous liez n'existe pas –

+0

@federicoscamuzzi Ajouté pour demander –

+0

ouais .. cela montre votre problème .. Vous ne pouvez pas générer un nouveau guid pour userID ... qhy faites-vous cela? –

Répondre

1

Vous avez ici une association 1: 0..1 (User:CompanyProfile). EF implémente ceci en utilisant la clé primaire de l'entité dépendante (CompanyProfile) comme clé étrangère à l'entité principale. Ainsi, les deux enregistrements ont le même PK dans la base de données.

Dans votre cas, ne pas être en mesure de regarder dans vos méthodes de service, je suppose que vous pouvez supprimer UserId de CompanyProfile et changer viewModel.UserId = new Guid(_identity.GetUserId()) en

viewModel.Id = new Guid(_identity.GetUserId()); 
+0

Grande Réponse Merci –

1

Je pense que votre problème est que vous générez nouveau Guid .. donc EF va dans l'erreur ... et si vous essayez juste avec ceci:

public virtual async Task<ActionResult> CreateProfile(CompanyProfileViewModel viewModel) 
     { 
      viewModel.UserId = _identity.GetUserId(); 
      if (ModelState.IsValid) 
      { 



    _companyProfileService.Create(viewModel); 
      await _uow.SaveAllChangesAsync(); 
     } 

     return View(MVC.Company.Profile.ActionNames.CreateProfile,viewModel); 

    } 

Ou essayez de récupérer l'utilisateur correct à partir de DB, puis le lier?

+0

utilisez Guid.parse (_identity.GetUserId()); mais pas fixe –