实体框架中的可选到可选关系

本文关键字:关系 框架 实体 | 更新日期: 2023-09-27 18:22:08

有人能指导我在这个场景中使用模型生成器吗。我试过这样的东西:

modelBuilder.Entity<User>()
        .HasOptional(f => f.Employee)
        .WithOptionalPrincipal(e => e.User);
public class User 
{
       public int UserID {get; set;}
       public virtual Employee employee{get; set;}
}
public class Employee 
{
       public int EmployeeID {get; set;}
       public int UserID {get; set;}
       public virtual User user {get; set;}
}

它不提取员工数据。

实体框架中的可选到可选关系

解决您的需求的方法是创建具有独立关联的一对多关系。

public class User // Principal
{
    public int UserID { get; set; } // PK
    public virtual Employee Employee { get; set; }
}
public class Employee // Dependent
{
    public int EmployeeID { get; set; } // PK
    // public int UserID {get; set; } // remove to create independent association
    public virtual User User { get; set; }
}

配置

modelBuilder.Entity<User>()
    .HasOptional(u => u.Employee)
    .WithOptionalPrincipal(e => e.User);

生成的数据库将创建一对多关系。用户成为委托人,员工成为受抚养人,但员工可以有可选的委托人。

using (var db = new AppContext())
{
    // User can have optional Employee.
    db.Users.Add(new User { UserID = 1, Employee = null });
    db.SaveChanges();
}
using (var db = new AppContext())
{
    // Employee can have optional User.
    db.Employees.Add(new Employee { EmployeeID = 1, User = null });
    db.Employees.Add(new Employee { EmployeeID = 2, User = null });
    db.SaveChanges();
}
 User            Employee
------     ----------------------
UserID     EmployeeID User_UserID
  1            1         null
               2         null

使员工(1)与用户(1)建立关系。

using (var db = new AppContext())
{
    var employee = db.Employees.Find(1);
    employee.User = db.Users.Find(1);
    db.SaveChanges();
}
 User            Employee
------     ----------------------
UserID     EmployeeID User_UserID
  1            1          1
               2         null

使员工(2)与用户(1)建立关系。

using (var db = new AppContext())
{
    var employee = db.Employees.Find(2);
    employee.User = db.Users.Find(1);
    db.SaveChanges();
}
 User            Employee
------     ----------------------
UserID     EmployeeID User_UserID
  1            1         null
               2          1

当然,如果我们从数据库中手动更改它,它会起作用,但在执行之后,EF可能会出现意外行为。

update Employees set User_UserId = 1