2

我有两张桌子。问题和用户资料

    public QuestionMap()
    {
        this.HasKey(t => t.QuestionId);

        this.Property(t => t.Title)
            .IsRequired()
            .HasMaxLength(100);

        this.Property(t => t.CreatedBy)
            .IsRequired();
    }

    public UserProfileMap()
    {
        this.HasKey(t => t.UserId);

        this.Property(t => t.UserName)
            .IsRequired()
            .HasMaxLength(56);
    }

我的存储库调用目前看起来像这样:

    public virtual IQueryable<T> GetAll()
    {
        return DbSet;
    }

有没有一种方法可以更改存储库调用,使其进入数据库,加入 Question 和 UserProfile 表,然后从 UserProfile 表中带回包含 UserName 的列表?我意识到我可能必须为返回类型创建另一个类(包括用户名),我可以这样做。

4

3 回答 3

2

您不能将属性映射配置到连接实体的某些字段。但是您可以在 Question 和 UserProfile 实体中创建导航属性,这将提供连接的实体:

public class Question
{
    public int QuestionId { get; set; }
    public string Title { get; set; }
    public virtual UserProfile CreatedBy { get; set; }
}

public class UserProfile
{
    public int UserId { get; set; }
    public string UserName { get; set; }
    public virtual ICollection<Question> Questions { get; set; }
}

并将映射配置添加到用户映射:

HasMany(u => u.Questions)
    .WithRequired(q => q.CreatedBy)
    .Map(m => m.MapKey("UserId"))
    .WillCascadeOnDelete(true);

现在,您将能够在查询问题时急切加载用户:

var questions = context.Questions.Include(q => q.CreatedBy);
foreach(var question in questions)
    Console.WriteLine(question.CreatedBy.UserName);
于 2013-07-05T20:39:49.297 回答
0

您应该在您的控制器而不是您的存储库中加入。存储库应该只处理数据库中的一个实体。

或者,您可以在数据库中创建一个视图,并将其作为实体添加到您的实体框架模型中。

于 2013-07-05T20:11:23.837 回答
0

实际上,您可以使用没有导航属性的 LINQ 连接表。让我演示一下:

public class Question
{
    public int QuestionID { get; set; }
    public string Title { get; set; }
    public string TextBody { get; set; }
    public int CreatedBy { get; set; }
}

public class UserProfile
{
    [Key]
    public int UserID { get; set; }
    public string UserName { get; set; }
    public string Password { get; set; }
}

这就是(非常简单的)模型。现在,我完全不熟悉IQueryable<T> GetAll()OP 帖子中显示的方法,但我假设此方法可用于返回一个IQueryable<Question>在执行时会从数据库中获取所有问题的方法。在我的示例中,我将改为使用它MyDbContext,但如果您愿意,可以将其替换为您的其他方法...

因此 LINQ 连接将按如下方式完成:

public void SomeMethod()
{
    var results = MyDbContext.Questions.Join(MyDbContext.UserProfiles,
        q => q.CreatedBy,
        u => u.UserID,
        (q,u) => new {
            q.QuestionID,
            q.Title,
            q.TextBody,
            u.UserName
        });
    foreach (var result in results)
    {
        Console.WriteLine("User {0} asked a question titled {1}:",
            result.UserName, result.Title);
        Console.WriteLine("\t{0}", result.TextBody)
    }
}

现在,我确实认为导航属性对于这种明显和常见的关系要好得多。但是,有时您可能不想为很少引用的关系添加导航属性。在这些情况下,使用该Join方法可能会更好。

于 2013-07-08T18:53:02.740 回答