一对一关系无法确定子方/受抚养方

问题描述 投票:0回答:4

我正在尝试在包管理器控制台中使用“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);

我有什么错误吗?

c# .net entity-framework .net-core entity-framework-core
4个回答
56
投票

您必须将以下代码放入 DBContext 类中,而不是 SnapShot 类中。不要修改 Snapshot 类,它是自动生成的类。

modelBuilder.Entity<Country>()
            .HasOne(a => a.CapitalCity)
            .WithOne(a => a.Country)
            .HasForeignKey<CapitalCity>(c => c.CountryID);

1
投票

只是指出,如果您真的不需要一对一的关系,您可以像这样解决它,并且迁移将开箱即用。在此示例中,如果

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


0
投票

您不必在 DBContext 类中指定外键。您也可以只添加

public int CountryId { get; set; }
到你的 CapitalCity 课程


-1
投票

有时主键可能不相等。因此,您应该检查所有关系的主键是否相同。
如果无法检查,可以执行以下操作:

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.

然后您就可以识别并修复干扰

© www.soinside.com 2019 - 2024. All rights reserved.