Я схожу с ума прямо сейчас. Я пытаюсь смоделировать свою модель базы данных с помощью свойств навигации, которые существуют как для дочерних, так и для родительских идентификаторов. Это означает, что у родительского элемента есть свойство nav, указывающее на дочернего элемента, а у дочернего элемента есть свойство nav, указывающее на родительского элемента.
Вот моя модель:
public class User : IdentityUser
{
public Company Company { get; set; }
public Employee Employee { get; set; }
}
public class Employee
{
[Key]
public int ID { get; set; }
public Address Address { get; set; }
public User Account { get; set; }
}
public class Company
{
[Key]
public int ID { get; set; }
public List<User> Accounts { get; set; }
}
public class Address
{
[Key]
public int ID { get; set; }
public Employee Employee { get; set; }
}
Затем я создал класс контекста базы данных примерно так:
public class UserManagementDbContext : IdentityDbContext<User>
{
public DbSet<Company> Companies { get; set; }
public DbSet<Employee> Employees { get; set; }
public DbSet<Address> Addresses { get; set; }
public UserManagementDbContext(DbContextOptions<UserManagementDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
builder.Entity<User>()
.OwnsOne(cu => cu.Employee)
.HasOne(e => e.Account);
builder.Entity<User>()
.HasOne(cu => cu.Company)
.WithMany(c => c.Accounts);
builder.Entity<Employee>()
.OwnsOne(e => e.Address)
.HasOne(a => a.Employee);
builder.Entity<User>().ToTable("Accounts");
builder.Entity<IdentityRole>().ToTable("Roles");
}
}
Затем я вызываю метод EnsureCreated () базы данных в моем Startup.cs следующим образом:
private async Task InitializeDatabase(IServiceProvider serviceProvider)
{
using (var serviceScope = serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
using (var db = serviceProvider.GetService<UserManagementDbContext>())
{
db.Database.EnsureCreated();
//...omitted
}
}
}
Это приложение, в котором происходит сбой с вышеуказанной ошибкой, и я не понимаю, почему. Нет связи между таблицами Accounts и Addresses. Либо я слепой как летучая мышь и не заметил опечатки, либо эта ошибка действительно сбивает с толку.
Может кто-нибудь помочь мне здесь?
РЕДАКТИРОВАТЬ: Обратите внимание, что я не хочу использовать внешние ключи, только свойства навигации.