10

이 코드는 이전에 저에게 도움이되었지만이 오류를 일으키는 원인이 무엇인지 잘 모릅니다. 내 유일한 추측은 플레이어를 만들려고 할 때 팀 데이터가 팀 테이블로 되돌려 보내지고 TeamId가 고유하므로이 오류 때문에 복제하려고하는 것입니다.원인 INSERT 문이 FOREIGN KEY 제약 조건과 충돌 했습니까?

오류

외래 키 제약 "FK_dbo.Players_dbo.Teams_TeamId"와 충돌 INSERT 문. 데이터베이스 "Web", 테이블 "dbo.Teams", 열 'TeamId'에서 충돌이 발생했습니다. 그 진술서는 만료되었습니다.

플레이어

public class Player 
{ 
    ... 
    ... 

    [HiddenInput(DisplayValue = false)] 
    [ForeignKey("Team")] 
    public int TeamId { get; set; }   

    public virtual Team Team { get; set; } 

    ... 
} 

public class Team 
{ 
    [Key] 
    [HiddenInput(DisplayValue = false)] 
    public int TeamId { get; set; } 

    .... 

    public virtual ICollection<Player> Players { get; set; } 
} 

컨트롤러

// 
    // GET: /Player/ 
    [HttpGet] 
    public ActionResult Create() 
    { 
     PopulateTeamsDropDownList(); 
     return View(); 
    } 

    // 
    // POST: /Player/ 
    [HttpPost] 
    public ActionResult Create(Player model) 
    { 
     if (ModelState.IsValid) 
     { 
      using (var db = new EfDb()) 
      { 
       var userProfile = db.UserProfiles.Single(u => u.UserName == User.Identity.Name); 
       if (userProfile != null) 
       { 
        var player = new Player 
            { 
             UserProfile = userProfile,            
             .... 
             ....            
            };       
        db.Players.Add(player);       

        db.SaveChanges(); 
       } 
      } 
     } 
     PopulateTeamsDropDownList(model.TeamId); 
     return View(model); 
    } 

    private void PopulateTeamsDropDownList(object selectedTeams = null) 
    { 
     var teamsQuery = from d in _iService.Teams 
         orderby d.Name 
         select d; 
     ViewBag.TeamID = new SelectList(teamsQuery, "TeamId", "Name", selectedTeams); 
    } 

보기

<div class="editor-label"> 
      @Html.LabelFor(model => model.TeamId, "Pick Your Team") 
    </div> 
    <div class="editor-field"> 
     @Html.DropDownList("TeamId", String.Empty) 
     @Html.ValidationMessageFor(model => model.TeamId) 
    </div> 

방법이 오류를 해결할 수 있습니까?

답변

8

플레이어 엔티티 용 팀과 같은 엔티티를 완료해야합니다. 특히 외래 키.

[HttpPost] 
    public ActionResult Create(Player model) 
    { 
     if (ModelState.IsValid) 
     { 
      using (var db = new EfDb()) 
      { 
       //Since you have the username cached, you can check the local EF cache for the object before hitting the db. 
       //var userProfile = db.UserProfiles.Single(u => u.UserName == User.Identity.Name); 
       var userProfile = db.UserProfiles.Local.SingleOrDefault(u => u.UserName == User.Identity.Name) 
           ?? db.UserProfiles.SingleOrDefault(u => u.UserName == User.Identity.Name); 
       if (userProfile != null) 
       { 
        var player = new Player 
            { 
             UserProfile = userProfile,            
             .... 
             ....            
            }; 
        player.TeamId = 5;      
        db.Players.Add(player);       

        db.SaveChanges(); 
       } 
      } 
     } 
     PopulateTeamsDropDownList(model.TeamId); 
     return View(model); 
    } 

보기에서 드롭 다운이 필수인지 확인하고 올바른 방법으로 값을 보냅니다.

+0

감사합니다, player.TeamId = 5;가 중요하다는 것이 밝혀졌습니다. 나는 내가 어떻게 이것을 놓쳤는 지 모른다. – Komengem

+1

@ Floradu88 플레이어가 있는지를 확인하기 위해 데이터베이스로 불필요한 이동을하고 있습니다. 코드에서 ID를 확인하면 이미 존재한다는 것을 알 수 있습니다. 성능이 좋지 않을 경우 업데이트해야합니다. –

+0

@FeistyMango 그건 원래 코드입니다. 왜냐하면'Player'는'UserProfile'의 자식이고'Player'를위한'UserId'가 필요하기 때문입니다. – Komengem

10

테이블에 레코드를 삽입 할 때 참조 열의 값이 아직 존재하지 않는 이유는 parent 테이블에 있기 때문입니다. 위의 문장을 실행하면 그들 중 누구도 참조 무결성 규칙을 위반하지 않기 때문에

// PARENT TABLE 
CREATE TABLE TableA 
(
    ID INT PRIMARY KEY 
); 

// CHILD TABLE 
CREATE TABLE TableB 
(
   ID INT PRIMARY KEY, 
    TableA_ID INT, 
    CONSTRAINT tb_FK FOREIGN KEY (TableA_ID) REFERENCES TableA(ID) 
); 


// RECORDS OF PARENT TABLE 
INSERT INTO TableA (ID) VALUES (1); 
INSERT INTO TableA (ID) VALUES (2); 

// RECORDS OF CHILD TABLE 
INSERT INTO TableB (ID, TableA_ID) VALUES (1,1); 
INSERT INTO TableB (ID, TableA_ID) VALUES (2,1); 
INSERT INTO TableB (ID, TableA_ID) VALUES (3,2); 

, 그것은 실패하지 않습니다 :

다음과 같은 시나리오를 생각해보십시오. 다음 문을 실행

봅니다 : Table1.ID에 존재하지 않는 삽입 할 TableA_ID의 값이있는 4 때문에

INSERT INTO TableB (ID, TableA_ID) VALUES (3,4); 

이 실패합니다. 외래 키는 레코드간에 참조 무결성을 보존했습니다.

+0

나는 이것이 또한 작동하지만,'Code First' 이후로 나는 오랫동안 일반 SQL을 실행하지 않았다고 확신한다. – Komengem

+0

특정 작업에 대해 시드 메서드를 사용합니다. P –

관련 문제