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.
我有三个实体; Country
、City
和 User
。
Country
和 City
通过从文件迁移到 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);
});
}
- 为什么需要从 Entity 派生?这些是 POCO classes.
- User 和 City 有 one-to-many 关系,对吧?那么城市需要有用户列表。
- 在 one-to-many 实体中,除了 object 本身之外,通常还有 ID 字段。所以,City 会有 CountryId.
可能,也把你的 DbContext class。而“实体只是一个带有 ID 的 parent”。嗯?以及如何生成此 ID - 除了 CityID、CountryID 等?你真是自找麻烦
建议。我通常创建一个包含所有表和外键的数据库 - 然后 运行 脚手架以获得 object 的基线。简化了很多!
然后从该模型开始,并进行必要的更改(如果有的话)。根据您的代码,我什至不确定您是否需要任何更改!
当涉及多个实体拥有一个 class 时,我无法理解 Fluent API。
错误:
The type 'City' cannot be configured as non-owned because an owned entity type with the same name already exists.
我有三个实体; Country
、City
和 User
。
Country
和 City
通过从文件迁移到 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);
});
}
- 为什么需要从 Entity 派生?这些是 POCO classes.
- User 和 City 有 one-to-many 关系,对吧?那么城市需要有用户列表。
- 在 one-to-many 实体中,除了 object 本身之外,通常还有 ID 字段。所以,City 会有 CountryId.
可能,也把你的 DbContext class。而“实体只是一个带有 ID 的 parent”。嗯?以及如何生成此 ID - 除了 CityID、CountryID 等?你真是自找麻烦
建议。我通常创建一个包含所有表和外键的数据库 - 然后 运行 脚手架以获得 object 的基线。简化了很多!
然后从该模型开始,并进行必要的更改(如果有的话)。根据您的代码,我什至不确定您是否需要任何更改!