2017-02-27 2 views
9

저는 녹색 asp.net 개발자이고 프로젝트에 최신 엔티티 프레임 워크를 사용하고 있습니다. 자동 생성 된 값으로 데이터베이스를 시드하는 데 문제가 있습니다 (필자 생각). 다음은 정확한 오류입니다.INSERT 문이 FOREGIGN KEY 제약 조건과 충돌했습니다.

enter image description here

여기에 코드입니다 :

public class Address 
{ 
     [Key] 
     [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
     public int AddressId { get; set; } 
// some more properties 
} 

public class ApplicationUser : IdentityUser 
{ 
     [ForeignKey("Address")]   
    public int AddressId { get; set; } 
    public Address Address { get; set; } 

// some more properties 
} 

public class Shelter 
{ 
     [Required] 
     [ForeignKey("Address")] 
     public int AddressId { get; set; } 
     public Address Address { get; set; } 
// some more properties 
} 
//seed 
private void CreateShelters() 
{ 
    EntityEntry<Address> MspcaAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "350 S Huntington Ave", 
       City = "Jamaica Plain", 
       State = "MA", 
       AreaCode = "02130", 
       Latitude = 42.3228928, 
       Longititude = -71.11120540000002 
    }); 
    EntityEntry<Address> BostonAnimalCareAndControlAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "26 Mahler Rd", 
       City = "Roslindale", 
       State = "MA", 
       AreaCode = "02131", 
       Latitude = 42.2943377, 
       Longititude = -71.12153390000003 
      }); 
      EntityEntry<Address> AnimalRescueLeagueOfBostonAddress = DbContext.Addresses.Add(new Address() 
      { 
       Street = "10 Chandler St", 
       City = "Boston", 
       State = "MA", 
       AreaCode = "0S2116", 
       Latitude = 42.3470486, 
       Longititude = -71.06976929999996 
      }); 

      EntityEntry<Shelter> Mspca = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "MCSPA", 
       AddressId = MspcaAddress.Entity.AddressId 
      }); 
      EntityEntry<Shelter> BostonAnimalCareAndControl = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Boston Animal Care And Control", 
       AddressId = BostonAnimalCareAndControlAddress.Entity.AddressId 
      }); 
      EntityEntry<Shelter> AnimalRescueLeagueOfBoston = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Animal Rescue League Of Boston Address", 
       AddressId = AnimalRescueLeagueOfBostonAddress.Entity.AddressId 
      }); 
      DbContext.SaveChanges(); 
    } 

내가 일치하지 않는 데이터/테이블에 문제가 있다면 확인하기 위해 데이터베이스를 다시 시도하지만, 난 여전히 오류를 얻고있다. 어떤 아이디어?

+2

현상금을 얹어도 문제가 해결되지 않습니다. * 여전히 오류가 발생합니다 ... *와 같은 의견을 따르지 않으려면 [mcve]를 제공해야합니다. *. 예외 메시지는 제공된 코드에 문제가 있음을 분명하게 나타 내기 때문에 (대부분 동일한 문제가 있지만) 'ApplicationUser'를 삽입하는 코드에서 발생합니다. –

+0

당신이 제공 한 코드는 데이터베이스에'ApplicationUser'를 새로 추가하지 않습니다. 오류는'ApplicationUser'에 대해 외래 키가 위반되었다고 말합니다. 동일한 코드를 디버깅하고 공유하고 있습니까? 게시 된 코드를 다시 살펴보고 동일한 코드가 아닌 경우 올바른 코드를 게시하십시오. –

답변

4

귀하가 시드하려고하는 "Shelter"엔티티는 기존 AddressID 코드를 제출해야합니다. 위 코드는 아직 작성되지 않은 주소의 주소 ID를 가져 오려고 시도합니다.

먼저 당신이 검색 AddressId와 보호소 개체를 만들 수 있습니다,

다음 (DbContext.SaveChanges();를 사용하여) 데이터베이스에 당신의 주소를 커밋해야합니다. 아래 코드는이를 수행 할 수있는 방법을 보여 주지만 addressId를 가져 오는 쿼리를 다시 작성해야 할 수도 있습니다. 또는 삽입 프로세스와 완전히 분리해야 할 수도 있습니다.

private void CreateShelters() 
{ 
    EntityEntry<Address> MspcaAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "350 S Huntington Ave", 
       City = "Jamaica Plain", 
       State = "MA", 
       AreaCode = "02130", 
       Latitude = 42.3228928, 
       Longititude = -71.11120540000002 
    }); 
    EntityEntry<Address> BostonAnimalCareAndControlAddress = DbContext.Addresses.Add(new Address() 
    { 
       Street = "26 Mahler Rd", 
       City = "Roslindale", 
       State = "MA", 
       AreaCode = "02131", 
       Latitude = 42.2943377, 
       Longititude = -71.12153390000003 
      }); 
      EntityEntry<Address> AnimalRescueLeagueOfBostonAddress = DbContext.Addresses.Add(new Address() 
      { 
       Street = "10 Chandler St", 
       City = "Boston", 
       State = "MA", 
       AreaCode = "0S2116", 
       Latitude = 42.3470486, 
       Longititude = -71.06976929999996 
      }); 

    DbContext.SaveChanges(); 


      EntityEntry<Shelter> Mspca = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "MCSPA", 
       AddressId = MspcaAddress.Entity.AddressId 
      }); 
      EntityEntry<Shelter> BostonAnimalCareAndControl = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Boston Animal Care And Control", 
       AddressId = DbContext.Addresses.Where(x => x.Street == "26 Mahler Rd").FirstOrDefault().AddressId 
     }); 
      EntityEntry<Shelter> AnimalRescueLeagueOfBoston = DbContext.Shelters.Add(new Shelter() 
      { 
       Name = "Animal Rescue League Of Boston Address", 
       AddressId = DbContext.Addresses.Where(x => x.Street == "10 Chandler St").FirstOrDefault().AddressId 

      }); 
      DbContext.SaveChanges(); 
    } 

희망이 있으면 충분합니다. addressId에 대한 쿼리가 작동하지 않는 경우 알려 주시면 기꺼이 도와 드리겠습니다.

+0

언급 된대로 작업을 분리했지만 동일한 오류가 발생합니다. 'Microsoft.EntityFrameworkCore.DbUpdateException : 항목을 업데이트하는 동안 오류가 발생했습니다. 자세한 내용은 내부 예외를 참조하십시오. ---> System.Data.SqlClient.SqlException : INSERT 문이 FOREIGN KEY 제약 조건 인 "FK_ApplicationUser_Address_AddressId"와 충돌했습니다. 이 충돌은 데이터베이스 "WalkFred-12340be6-0442-4622-b782-a7412bb7d321", 테이블 "dbo.Address", "AddressId"열에서 발생했습니다. – user664509

+0

유효한 AddressId를 검색하는 방법의 샘플을 사용하여 코드를 편집했습니다. 당신은 올바른 Addressid – DaniDev

+0

을 얻기 위해 그 코드를 수정하여 코드를 복사하여 내 프로젝트에 붙여 넣을 수 있으며 동일한 오류가 발생합니다. – user664509

2

이 문제의 핵심은 :) Id 값 대신 참조 속성을 사용하는 것입니다. 즉, AddressId 대신 Address을 설정하십시오. EF가 변경 사항을 저장하면 엔티티 간의 종속성을 파악하고 올바른 순서로 모두 저장하며, 생성 된 키 값을 외래 키 값으로 설정하면됩니다. 당신이 보여 오류가 ApplicationUserAddressId에 적용되지만

var mspcaAddress = new Address(); 
var bostonAnimalCareAndControlAddress = new Address(); 
var animalRescueLeagueOfBostonAddress = new Address(); 
context.Addresses.AddRange(new[] 
{ 
    mspcaAddress, 
    bostonAnimalCareAndControlAddress, 
    animalRescueLeagueOfBostonAddress 
}); 

var mspca = new Shelter() 
{ 
    Address = mspcaAddress 
}; 
var bostonAnimalCareAndControl = new Shelter() 
{ 
    Address = bostonAnimalCareAndControlAddress 
}; 
var animalRescueLeagueOfBoston = new Shelter() 
{ 
    Address = animalRescueLeagueOfBostonAddress 
}; 
context.Shelters.AddRange(new[] 
{ 
    mspca, 
    bostonAnimalCareAndControl, 
    animalRescueLeagueOfBoston 
}); 
context.SaveChanges(); 

, 나는 비슷한 접근 방식을 생각 :

당신 코드의 본질과 같아야합니다 (즉 간결, 속성 할당을 떠나) ApplicationUser을 생성하면 문제가 해결됩니다.

그런데 첫 번째 context.Addresses.AddRange 문 없이는 할 수 있습니다. 보호소를 추가하면 주소가 추가됩니다.

또한 코드에서 EntityEntry을 삭제했습니다. 나는 그들이 불필요하게 코드를 복잡하게 만든다고 생각한다. 당신은 당신이 만들고있는 단순한 객체 만 필요로합니다.

+1

기록을 위해, 나는 당신의 대답에 투표하지 않았습니다. 나는 어제 그것을 실제로 알아 차렸다. 그리고 나는 그것을 좋아한다! (그것이 작동하는지, 나는 테스트하지 않은 것으로 가정). 또한 주소 필드를 시드하는 방법도 표시하지 않습니다. 큰 문제는 아니지만 그 중 일부는 필수 항목 일 수 있습니다 (null이 아님). – DaniDev

관련 문제