实体框架中的可选到可选关系
本文关键字:关系 框架 实体 | 更新日期: 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