首先,我首先是 EF 代码和 .NET 的新手。
我正在开发一个使用 MVC4、EF、JQuery、AutoMapper 和其他技术和库构建的移动 Web 应用程序。
这可能会令人困惑,但我会尽力正确解释。
我有以下pocos:
public class Test
{
[Key]
public int TestId { get; set; }
.
.
Other properties
.
.
public virtual ICollection<Question> Questions { get; set; }
public virtual ICollection<UserStatus> UserStatuses { get; set; }
}
public class UserStatus
{
[Key]
public int UserStatusId { get; set; }
public int TestId { get; set; }
public string Customer { get; set; }
.
.
Other properties
.
.
}
public class Question
{
[Key]
public int QuestionId { get; set; }
public int TestId { get; set; }
.
.
Other properties
.
.
}
在我的上下文课程中,我有:
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
Database.SetInitializer<CmeContext>(null);
modelBuilder.Entity<Test>()
.HasKey(a => new { a.TestId })
.HasMany(s => s.Questions);
modelBuilder.Entity<Test>()
.HasKey(a => new { a.TestId })
.HasMany(s => s.UserStatuses);
}
上面的Test对象通过TestId与Question和UserStatus对象是一对多的关系。每个测试都有自己的一组问题,每个测试 4 个问题,每个问题 20 个 userStatuses 5 个)。顾名思义,UserStatus 表有用户状态;它让我知道用户回答了什么测试中的哪些问题。
控制器中的代码:
var filtered = (from test in _ctxCmeContext.Test.Include("UserStatus").Include("Question")
where test.Program == "SomeProgram" && test.IssueDate.Value.Year == year && test.IssueDate.Value.Month == monthNumber
orderby test.IssueDate descending
select new { test,
Questions = test.Questions,
UserStatuses = test.UserStatuses.Where(x => x.Customer == currentUserId) });
如您所见,我有一个匿名类,因此我可以获取由 currentUserId 过滤的 UserStatuses 集合,以仅获取当前用户的状态。此时一切正常。
这是我需要做的:
每个问题都需要知道自己的状态,所以它是 Question 和 UserStatus 表之间的一对一关系
在我的上下文类中,我添加了以下内容:
modelBuilder.Entity<Question>()
.HasRequired(x => x.UStatus)
.WithOptional();
在我的问题对象中:
public virtual UserStatus UStatus { get; set; }
我还修改了我的 linq 语句如下:
var filtered = (from test in _ctxCmeContext.Test.Include("UserStatus").Include("Question").Include("UStatus")
where test.Program == "SomeProgram" && test.IssueDate.Value.Year == year && test.IssueDate.Value.Month == monthNumber
orderby test.IssueDate descending
select new { test,
QuestionStatus = test.Questions.Select(u=>u.UStatus),
Questions = test.Questions,
UserStatuses = test.UserStatuses.Where(x => x.Customer == currentUserId) });
结果:
UStatus 属性包含每个问题的数据,但不是针对当前用户,也不是针对正确的测试;在我看来,它只是从 Question 表中抓取了它遇到的第一个具有相同 QuestionId 的记录。不好。
所以我将关系更改为一对多:
在我的上下文类中,我替换了:
modelBuilder.Entity<Question>()
.HasRequired(x => x.UStatus)
.WithOptional();
和:
modelBuilder.Entity<Question>()
.HasKey(a => new { a.QuestionId })
.HasMany(s => s.UStatus);
将问题对象中的 UStatus 属性更改为:
public virtual ICollection<UserStatus> UStatus { get; set; }
并从 linq 语句中删除了以下内容
QuestionStatus = test.Questions.Select(u=>u.UStatus),
这次我能够得到一些正确的数据,但只有前 4 个问题,其余的都是空的
我不知道该怎么办了。请帮帮我。