簡體   English   中英

Entity Framework Core 雙向關系

[英]Entity Framework Core bidirectional relationship

如何使雙向關系在 Entity Framework Core 中工作?

  • 做.net 6
  • 英孚核心 6.0.13
public class User
{
    public int id { get; set; }
    public string username { get; set; }

    public Department Department{ get; set; }
    public int DepartmentId { get; set; }
}

public class Department
{
    public int Id { get; set; }
    public string Name { get; set; }

    public User? Manager { get; set; }
    public int? ManagerId { get; set; }
    public ICollection<AppUser> Users { get; set; }
}

數據庫上下文 class

public DbSet<User> Users { get; set; }
public DbSet<Department> Departments { get; set; }

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Department>()
                        .HasOne(d => d.Manager)
                        .WithOne(u => u.Department)
                        .HasForeignKey<Department>(d => d.ManagerId);

            modelBuilder.Entity<AppUser>()
                        .HasOne(u => u.Department)
                        .WithMany(d => d.Users)
                        .HasForeignKey(user => user.DepartmentId);


            modelBuilder.SeedDepartments();
        }

遷移錯誤

無法在“Department.Users”和“AppUser.Department”之間創建關系,因為“Department.Manager”和“AppUser.Department”之間已經存在關系。 導航只能參與單一關系。 如果您想首先在“OnModelCreating”中覆蓋導航“AppUser.Department”上的現有關系調用“忽略”

您遇到此問題是因為您試圖在兩種不同的關系中使用相同的導航屬性User.Department 從理論上講,您可以使用這種結構讓一個用戶管理某個部門 X,同時屬於另一個部門,例如:

var u = new User{
  id = 1,
  DepartmentId = 1
};
var dept = new Department{
  Id = 2,
  ManagerId = 1,
};

- 在數據庫級別沒有什么能阻止您。 因此,您需要在用戶級別添加一個額外的導航屬性,並在您的實體配置中進行相應的更改:

public class User
{
    public int id { get; set; }
    public string username { get; set; }

    public Department Department{ get; set; }
    public int DepartmentId { get; set; }
    public Department? ManagedDepartment { get; set; }
}

...

protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            base.OnModelCreating(modelBuilder);

            modelBuilder.Entity<Department>()
                        .HasOne(d => d.Manager)
                        .WithOne(u => u.ManagedDepartment)
                        .HasForeignKey<Department>(d => d.ManagerId);

            modelBuilder.Entity<AppUser>()
                        .HasOne(u => u.Department)
                        .WithMany(d => d.Users)
                        .HasForeignKey(user => user.DepartmentId);


            modelBuilder.SeedDepartments();
        }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM