实体框架 - 多对多表中的空引用

时间:2014-08-02 22:46:02

标签: c# linq entity-framework null many-to-many

我正在尝试与Entity Framework建立多对多关系。这种关系本身也起作用 - 我有一个表User.7用于用户和目标之间的关系。

问题:当我尝试从User访问UserGoals数据时,UserGoals.Goal为空。同样,当我尝试从Goal访问UserGoals.User时,它也是null。这张图片应该更清晰:

Screenshot of the data structure

是否可以从那里访问目标?如果没有,这将使事情复杂化。我想知道这是否可能,因为如果是,那么它将在这里创建一个循环关系(用户 - > UserGoals - >目标 - > UserGoals - >用户 - >无限广告)。另一方面,我猜Entity Framework和Linq to Entities可以处理它。

这是我正在使用的代码。如果可以做我需要的,请提供必要的更正。

public class User
{
    [Key]
    public int UserId { get; set; }

    public virtual ICollection<Goal> CreatedGoals { get; set; }
    public virtual ICollection<UserGoal> UserGoals { get; set; }

    public IQueryable<Goal> AllGoals
    {
        get
        {
            return CreatedGoals.Union(UserGoals.Select(ug => ug.Goal)).AsQueryable();
        }
    }
}

public class UserGoal
{
    [Key]
    public int Id { get; set; }

    [Required]
    public int UserId { get; set; }
    [ForeignKey("UserId")]
    public User User { get; set; }

    [Required]
    public int GoalId { get; set; }
    [ForeignKey("GoalId")]
    public Goal Goal { get; set; }

    [Required]
    [Range(minimum: 1, maximum: 5)]
    public Int16 Priority { get; set; }
}

public class Goal
{
    [Key]
    public int GoalId { get; set; }

    public int AuthorId { get; set; }
    [ForeignKey("AuthorId")]
    public virtual User Author { get; set; }

    public virtual ICollection<UserGoal> UserGoals { get; set; }
}

class EFDbContext : DbContext
{
    public DbSet<Goal> Goals { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<User>()
            .HasMany(u => u.CreatedGoals)
            .WithRequired()
            .HasForeignKey(u => u.AuthorId);
        modelBuilder.Entity<User>()
            .HasMany(u => u.UserGoals)
            .WithRequired()
            .HasForeignKey(u => u.UserId);
        modelBuilder.Entity<Goal>()
            .HasMany(u => u.UserGoals)
            .WithRequired()
            .HasForeignKey(u => u.GoalId);

        base.OnModelCreating(modelBuilder);
    }
}

2 个答案:

答案 0 :(得分:1)

我认为您的查询只是不加载附加到您的UserGoals的UsersGoals。你有没有禁用延迟加载?如果是这样,您需要编写类似.Include(user => user.UserGoals.Select(ug => ug.Goal))

的内容

完整的代码段:

public User GetUser(int userId)
{
   User singleUser = null;

   using(var db = new MyContext())
   {
      var users = from user in db.Users.Include(u => u.UserGoals.Select(ug => ug.Goal))
                where user.UserId == userId
                select user;

      singleUser = users.FirstOrDefault();
   }

   return singleUser;
}

答案 1 :(得分:0)

在您查询用户的代码中,您可以在访问UserGoals属性之前尝试调用include(&#34; UserGoals&#34;)。

Haven自己尝试过你的代码。如果它不起作用,我会在这里试一试。