[英]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.