一对多,一对一实体框架

本文关键字:框架 实体 一对一 一对多 | 更新日期: 2023-09-27 18:14:30

处理实体框架中的关系时遇到一些问题。

我发现了一个类似的帖子:实体框架实体w/一对多和一对一?

但它没有回答我的问题。

我想要实现的是两个实体之间的关系,它们既具有一对多关系,又具有一对一/可选关系。

这是代码:

public class User
{
    [Key]
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)]
    public int UserId { get; set; }
    public string Username { get; set; }
    [Required]
    public int GroupID { get; set; }
    [ForeignKey("GroupID")]
    public virtual Group Group { get; set; }
}
public class Group
{
    [Key]
    public int ID { get; set; }
    public string Name { get; set; }
    [Required]
    public int GroupAdminID { get; set; }
    [ForeignKey("GroupAdminID")]
    public virtual User GroupAdmin { get; set; }        
    [ForeignKey("UserId")]
    public virtual List<User> Members { get; set; }
}

这些与以下流畅的API代码链接:

modelBuilder.Entity<User>().HasRequired(u => u.Group).WithMany(g => g.Members);
modelBuilder.Entity<Group>().HasRequired(g => g.GroupAdmin).WithOptional();

组可以有多个成员,但只有一个管理员。当一个用户连接到一个(且只有一个)组时。

我显然搞砸了什么,因为在我的脑海里这应该是可行的。

如果有人能帮忙的话,我会很感激的。

问候,罗宾

一对多,一对一实体框架

单独使用实体框架,你不能强制你的GroupAdmin需要在你的成员列表中(顺便说一下,如果你想要LazyLoading,它应该是iccollection类型的)

这类规则不应该驻留在持久层中,它们属于某种业务层,在该业务层中,您可以指定GroupAdmin不包含在members List中的组无效

    User类中缺少
  1. Groups
  2. GroupAdminIDGroup类中是必需的,所以你不能把它设为可选的。

public class User
{
   public User()
   {
      Groups = new List<Group>();
   }
   public virtual ICollection<Group> Groups { get; set; }
   ....
}
public partial class Group
{
    public Group()
    {
        Members = new List<User>();
    }
    public virtual ICollection<User> Members { get; set; }
    ....
}
modelBuilder.Entity<User>()
    .HasRequired(u => u.Group)
    .WithMany(u => u.Members)
    .HasForeignKey(u => u.GroupID);
modelBuilder.Entity<Group>()
    .HasRequired(g => g.GroupAdmin)
    .WithMany(g => g.Groups)
    .HasForeignKey(d => d.GroupAdminID);