我正在尝试在包管理器控制台中使用“update-database”命令更新我的数据库,但我遇到了这种错误:
The child/dependent side could not be determined for the one-to-one
relationship between 'Country.CapitalCity' and 'CapitalCity.Country'. To
identify the child/dependent side of the relationship, configure the foreign
key property. If these navigations should not be part of the same
relationship configure them without specifying the inverse. See
http://go.microsoft.com/fwlink/?LinkId=724062 for more details.
我的模型类如下所示:
public class Country
{
public int ID { get; set; }
public string Name { get; set; }
public long Population { get; set; }
public int CapitalCityID { get; set; }
public CapitalCity CapitalCity { get; set; }
}
public class CapitalCity
{
public int ID { get; set; }
public int Name { get; set; }
public int CountryID { get; set; }
public Country Country { get; set; }
}
搜索有关此问题的信息后,我在 DbContextModelSnapshot 中添加了以下代码,但仍然有问题。
modelBuilder.Entity<Country>()
.HasOne(a => a.CapitalCity)
.WithOne(a => a.Country)
.HasForeignKey<CapitalCity>(c => c.CountryID);
我有什么错误吗?
您必须将以下代码放入 DBContext 类中,而不是 SnapShot 类中。不要修改 Snapshot 类,它是自动生成的类。
modelBuilder.Entity<Country>()
.HasOne(a => a.CapitalCity)
.WithOne(a => a.Country)
.HasForeignKey<CapitalCity>(c => c.CountryID);
只是指出,如果您真的不需要一对一的关系,您可以像这样解决它,并且迁移将开箱即用。在此示例中,如果
CapitalCity
可以与不同国家/地区共享相同的名称,则有效。您当然需要考虑一个国家更改其首都名称但另一个国家没有更改的可能性。
public class Country
{
public int ID { get; set; }
public string Name { get; set; }
public long Population { get; set; }
public int CapitalCityID { get; set; }
public CapitalCity CapitalCity { get; set; }
}
public class CapitalCity
{
public int ID { get; set; }
public int Name { get; set; }
}
在这种情况下,更好的解决方案可能是这样的:
public class Country
{
public int ID { get; set; }
public string Name { get; set; }
public long Population { get; set; }
public List<CapitalCity> CapitalCities { get; set; } = new List<CapitalCity>();
}
public class CapitalCity
{
public int ID { get; set; }
public int Name { get; set; }
public int CountryID { get; set; }
public Country Country { get; set; }
}
我认为这更好,因为很多国家都有或曾经有多个首都城市。
https://en.wikipedia.org/wiki/List_of_countries_with_multiple_capitals
您不必在 DBContext 类中指定外键。您也可以只添加
public int CountryId { get; set; }
到你的 CapitalCity 课程
有时主键可能不相等。因此,您应该检查所有关系的主键是否相同。
如果无法检查,可以执行以下操作:
builder.Entity<Country>()
.HasOne(a => a.CapitalCity)
.WithOne(a => a.Country)
.HasForeignKey<Country>(c => c.CapitalCityID);
为所有
HasForeignKey<Country>
输入 WithOne
以获得此警告
The relationship from 'User.AppUser' to 'AppUser.User' with foreign key properties {'CapitalCityID' : int} cannot target the primary key {'ID' : long} because it is not compatible. Configure a principal key or a set of foreign key properties with compatible types for this relationship.
然后您就可以识别并修复干扰