2017-02-27 19 views
9

Tôi là nhà phát triển asp.net xanh và tôi đang sử dụng khung pháp nhân mới nhất với dự án của mình. Tôi đang gặp vấn đề khi tạo cơ sở dữ liệu của tôi với các giá trị được tạo tự động (tôi nghĩ). Đây là lỗi chính xác.Tuyên bố INSERT xung đột với ràng buộc KEY FOREGIGN

enter image description here

Dưới đây là các mã:

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

tôi đã cố gắng tái tạo lại cơ sở dữ liệu để xem nếu một vấn đề với dữ liệu không phù hợp/bảng nhưng tôi vẫn nhận được lỗi. Bất kỳ ý tưởng?

+2

Đặt tiền thưởng không làm cho câu hỏi trở nên tốt hơn. Bạn vẫn cần phải cung cấp [mcve] để tránh theo dõi các nhận xét như * Tôi vẫn gặp lỗi ... *. Bởi vì thông báo ngoại lệ cho thấy rõ ràng vấn đề không nằm trong mã được cung cấp (mặc dù rất có thể nó có cùng vấn đề), nhưng trong một mã chèn 'ApplicationUser'. –

+0

Mã bạn đã cung cấp không thêm 'ApplicationUser' mới vào cơ sở dữ liệu, trong khi lỗi nói rằng khóa ngoài bị vi phạm cho' ApplicationUser'. Bạn có chắc là bạn đang gỡ lỗi và chia sẻ cùng một mã. Xin vui lòng xem lại mã đăng bài mã chính xác nếu nó không giống nhau. –

Trả lời

4

Các tổ chức "Shelter" của bạn, mà bạn đang cố gắng tạo hạt giống, yêu cầu bạn gửi một mã hiện tại AddressID Mã của bạn ở trên cố gắng lấy địa chỉ của một địa chỉ chưa được tạo.

Trước tiên, bạn phải Commit địa chỉ của bạn vào cơ sở dữ liệu (sử dụng DbContext.SaveChanges();)

Sau đó, bạn có thể tạo các đối tượng Shelter với AddressID lấy ra. Đoạn mã dưới đây cho thấy một ví dụ về cách bạn có thể làm điều này, nhưng bạn có thể phải viết lại các truy vấn tìm nạp addressId. Hoặc, bạn có thể phải tách chúng ra khỏi quá trình chèn hoàn toàn.

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

Hy vọng điều này là đủ để bạn đi qua. Nếu các truy vấn cho addressId không hoạt động, hãy cho tôi biết và tôi sẽ sẵn lòng trợ giúp bạn với những yêu cầu đó.

+0

Tách các hoạt động như đã đề cập nhưng tôi nhận được lỗi tương tự. 'Microsoft.EntityFrameworkCore.DbUpdateException: Đã xảy ra lỗi khi cập nhật các mục nhập. Xem ngoại lệ bên trong để biết chi tiết. ---> System.Data.SqlClient.SqlException: Câu lệnh INSERT xung đột với ràng buộc KEY NGOẠI HỐI "FK_ApplicationUser_Address_AddressId". Xung đột xảy ra trong cơ sở dữ liệu "WalkFred-12340be6-0442-4622-b782-a7412bb7d321", bảng "dbo.Address", cột 'AddressId'.' – user664509

+0

Tôi đã chỉnh sửa mã bằng mẫu về cách lấy một AddressId hợp lệ. bạn có thể tinker với điều đó để có được Addressid chính xác – DaniDev

+0

Tôi sao chép và dán mã của bạn vào dự án của tôi và tôi nhận được cùng một lỗi. – user664509

2

Chìa khóa :) cho vấn đề này là sử dụng thuộc tính tham chiếu thay vì giá trị Id. Điều này có nghĩa là: đặt Address thay vì AddressId. Khi EF lưu các thay đổi, nó sẽ tìm ra sự phụ thuộc giữa các thực thể và lưu tất cả chúng theo thứ tự đúng, trong khi thiết lập các giá trị khóa AddressId được tạo ra ngay trong thời gian như các giá trị khóa ngoài.

Bản chất của bạn mã (tức là bỏ đi nhiệm vụ bất động sản, cho ngắn gọn) nên trông như thế này:

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

Mặc dù lỗi bạn hiển thị áp dụng cho một AddressId trong ApplicationUser, tôi nghĩ rằng một cách tiếp cận tương tự trong tạo ra ApplicationUser s sẽ giải quyết vấn đề.

Nhân tiện, bạn có thể thực hiện mà không có câu lệnh context.Addresses.AddRange đầu tiên. Các địa chỉ sẽ được thêm bằng cách thêm các nơi trú ẩn.

Lưu ý rằng tôi cũng đã xóa EntityEntry s khỏi mã. Tôi nghĩ rằng họ không cần thiết phức tạp mã. Bạn chỉ cần các đối tượng đơn giản mà bạn đang tạo.

+1

Chỉ cần cho hồ sơ, tôi đã không bỏ phiếu bình chọn của bạn. Tôi thực sự nhận thấy nó ngày hôm qua và tôi thích nó! (giả sử nếu nó hoạt động, mà tôi chưa thử nghiệm). BTW, Bạn cũng không hiển thị cách tạo các trường địa chỉ. Không phải là một vấn đề lớn nhưng một số trong số đó có thể được yêu cầu (không phải là null). – DaniDev

Các vấn đề liên quan