2017-02-27 141 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上面的代码尝试获取尚未创建的地址的AddressId。

您必须先提交到数据库中的地址(使用DbContext.SaveChanges();

然后,您可以创建与检索到的AddressId住房的实体。下面的代码显示了如何执行此操作的示例,但是您可能必须重新编写提取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值。这意味着:设置Address而不是AddressId。当EF保存更改时,它会找出实体之间的依赖关系并将它们全部保存为正确的顺序,同时将生成的AddressId关键值恰好作为外键值进行设置。

你代码的实质(即离开了财产分配,为简洁起见)应该是这样的:

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

虽然您显示错误适用于ApplicationUserAddressId,我想在一个类似的方法创建ApplicationUser即可解决问题。

顺便说一句,您可以不用第一个context.Addresses.AddRange声明。地址将通过添加避难所而添加。

请注意,我也从代码中删除了EntityEntry。我认为他们不必要地使代码复杂化。你只需要你正在创建的简单对象。

+1

只是为了记录,我没有投下你的答案。我昨天真的注意到了,我喜欢它! (假设它工作,我没有测试过)。顺便说一句,你也不会显示如何播种地址字段。没什么大不了的,但其中一些可能是必需的(非空)。 – DaniDev

相关问题