我正在尝试与Entity Framework建立多对多关系。这种关系本身也起作用 - 我有一个表User.7用于用户和目标之间的关系。
问题:当我尝试从User访问UserGoals数据时,UserGoals.Goal为空。同样,当我尝试从Goal访问UserGoals.User时,它也是null。这张图片应该更清晰:
是否可以从那里访问目标?如果没有,这将使事情复杂化。我想知道这是否可能,因为如果是,那么它将在这里创建一个循环关系(用户 - > 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);
}
}
答案 0 :(得分:1)
我认为您的查询只是不加载附加到您的UserGoals的Users
和Goals
。你有没有禁用延迟加载?如果是这样,您需要编写类似.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自己尝试过你的代码。如果它不起作用,我会在这里试一试。