一对多,一对一实体框架
本文关键字:框架 实体 一对一 一对多 | 更新日期: 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类中缺少
- Groups。
- GroupAdminID在Group类中是必需的,所以你不能把它设为可选的。
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);
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);