具有一对一实体框架的一对多

时间:2014-07-24 13:31:09

标签: c# entity-framework

在实体框架中遇到关系问题。

我找到了类似的帖子:Entity Framework Entity w/ One-to-Many and One-to-One?

但它没有回答我的问题。

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

这是代码:

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();

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

我显然搞砸了一些东西,因为在我的脑海中这应该有用。

如果有人可以提供帮助,我会很感激。

问候,罗宾

2 个答案:

答案 0 :(得分:0)

单独使用Entity Framework,您无法强制执行GroupAdmin需要在您的成员列表中的规则(如果您想要LazyLoading,则应该按照ICollection的类型)

这些规则不应驻留在持久层中,它们属于某种业务层,您可以在其中指定Memebers列表中未包含GroupAdmin的Group无效。

答案 1 :(得分:0)

    用户类中缺少
  1. 群组
  2. 类中需要
  3. GroupAdminID ,因此您无法将其设为可选项。
  4. 代码

    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);