[英]Entity Framework Core bidirectional relationship
如何使雙向關系在 Entity Framework Core 中工作?
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.