C# .net 5 - 多个实体拥有的 OnModelCreating 实体

C# .net 5 - OnModelCreating Entity owned by multiple Entities

当涉及多个实体拥有一个 class 时,我无法理解 Fluent API。

错误:

The type 'City' cannot be configured as non-owned because an owned entity type with the same name already exists.

我有三个实体; CountryCityUser

CountryCity 通过从文件迁移到 HasData() 方法获得种子。 User 由最终用户创建,城市 属性 可以是 null.

public class Country : Entity
{
    public List<City> Cities { get; init; }

    public Country()
    {
        Cities = new List<City>();
    }

}


public class City : Entity
{
    public int CountryID { get; set; }
    public Country Country { get; set; }
    public string Name { get; set; }
    public List<User> Users { get; init; }
    public City()
    {
        Users = new List<User>();
    }

}



public class User : Entity
{
    public int CityID { get; set; }
    public City City { get; set; }
}

现在我的基本 OnModelCreating 包含:

    builder.Entity<Country>(c =>
    {
        c.HasData(countriesList.ToArray());

        c.OwnsMany(x => x.Cities)
            .HasData(LoadCities(countryToLoadCities));
    });

但我不确定如何编写它来理解所需的“User.City”属性。我尝试了多个选项,包括直接导航 属性、外键 + 导航 属性 和介于 UserCity 之间的对象。但是迁移不断向我抛出错误,我不确定它要我做什么。

protected override void OnModelCreating(ModelBuilder builder)
{
    base.OnModelCreating(builder);
    builder.Ignore<Entity>();

    //Load all country codes
    Country countryToLoadCities = null;
    var countriesList = LoadCountries(out countryToLoadCities);
    
    builder.Entity<Country>(c =>
    {
        c.HasData(countriesList);
        var b = c.OwnsMany(x => x.Cities);
        b.WithOwner().HasForeignKey(x => x.CountryID);
        b.HasData(LoadCities(countryToLoadCities));
        b.Ignore(x => x.Users);
        //b.OwnsMany(x => x.Users).WithOwner().HasForeignKey(f => f.CityID);

    });

    builder.Entity<Guild>(g => {
        g.OwnsMany(x => x.Channels).WithOwner().HasForeignKey(q => q.GuildID);
        var userBuilder = g.OwnsMany(x => x.Users);
        userBuilder.WithOwner().HasForeignKey(q => q.GuildID);
        userBuilder.HasOne(u => u.City).WithMany().HasForeignKey(q => q.CityID);

    });
}
  1. 为什么需要从 Entity 派生?这些是 POCO classes.
  2. User 和 City 有 one-to-many 关系,对吧?那么城市需要有用户列表。
  3. 在 one-to-many 实体中,除了 object 本身之外,通常还有 ID 字段。所以,City 会有 CountryId.

可能,也把你的 DbContext class。而“实体只是一个带有 ID 的 parent”。嗯?以及如何生成此 ID - 除了 CityID、CountryID 等?你真是自找麻烦

建议。我通常创建一个包含所有表和外键的数据库 - 然后 运行 脚手架以获得 object 的基线。简化了很多!

然后从该模型开始,并进行必要的更改(如果有的话)。根据您的代码,我什至不确定您是否需要任何更改!