1

Когда я хочу создать или добавить данные в базе данных, я получаю эту ошибку:Инструкции INSERT заявление противоречит ограничению внешнего ключа ... В 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.

У меня есть отношение один-к-одному между User и 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); 

    } 
} 

Также я получаю этот запрос в 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] */) 

Мой пост 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); 
    } 

скриншот таблицы CompanyProfile:

enter image description here

+0

Вы можете разместить код, в котором вы пытаетесь добавить его? .. Потому что это похоже на то, что EF пытается добавить и нового пользователя (даже если он уже существует), или, может быть, пользователь, которого вы связываете, не существует –

+0

@federicoscamuzzi Добавлено в профиль –

+0

да .. это покажет вашу проблему .. вы не можете создать новый guid для userID ... qhy вы это делаете? –

ответ

1

У вас есть ассоциация 1: 0..1 здесь (User:CompanyProfile). EF реализует это с использованием первичного ключа зависимого объекта (CompanyProfile) в качестве внешнего ключа к основному объекту. Таким образом, обе записи имеют одну и ту же PK в базе данных.

В вашем случае, не будучи в состоянии смотреть в ваши методы обслуживания, я предполагаю, что вы можете удалить UserId из CompanyProfile и изменить viewModel.UserId = new Guid(_identity.GetUserId()) в

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

Отличный ответ Спасибо –

1

Я думаю, ваша проблема в том, что вы генерации новый Guid .. поэтому EF идет по ошибке ... что, если вы просто попробуете с этим:

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); 

    } 

Или попытайтесь вывести правильного пользователя из базы данных и затем связать его?

+0

use Guid.parse (_identity.GetUserId()); но не исправлено –