【问题标题】:How many to many relationship table do I draw data with code-first?我使用代码优先绘制数据的多对多关系表?
【发布时间】:2016-12-16 22:25:01
【问题描述】:

我的学生姓名和课程名称中有两个表格。他们之间有很多关系。我如何吸取学习者的教训?以下是我写的实体。

public class Student
{
        public Student()
        {
            Lessons = new HashSet<Lesson>();
        }

        public int ID { get; set; }
        public int MaxCredit { get; set; }
        public int MemberID { get; set; }
        public virtual Member Member { get; 
        public virtual ICollection<Lesson> Lessons { get; set; }
}

public class Lesson
{
        public Lesson()
        {
            Students = new HashSet<Student>();
        }

        public int ID { get; set; }
        public string Name { get; set; }
        public int LessonCredit { get; set; }
        public virtual ICollection<Student> Students { get; set; }
}

我试图给学生上课:

uow.LessonRepository.GetALL().Where(x=> x.Students.Any(s=> s.MemberID==id))

但它给了我一个铸造错误。

【问题讨论】:

  • 你似乎拥有它;该代码有什么问题?
  • 比如我想上学生x的课,怎么上?
  • 只需访问Student 对象的Lessons 属性。那不行吗?
  • 我正在使用 EntityFramework。我正在尝试这样的事情。但它说演员。我不明白他为什么要投一些已经在名单上的东西。 _uow.LessonRepository.GetALL().Where(x=> x.Students.Any(s=> s.MemberID==id));
  • 请更具体地说明您的错误(以及使用它的代码)您的 EF 模型看起来正确。该代码是一个 start 虽然看起来有点荒谬。如果您想要学生课程,为什么不做类似students.FirstOrDefault(s =&gt; s.Id == id).Lessons 的事情?在您的代码中,您需要显示您将其分配给的内容,再次具体的转换错误会很好。

标签: c# list ef-code-first


【解决方案1】:

您的 EF 模型是正确的,要建立多对多关系,双方都有另一个类型的 virtual ICollection&lt;T&gt;

您的查询不正确,但如果您想获取学生的课程,解析它我们从LessonRepository(可能是IEnumerable&lt;Lesson&gt;)开始,然后对其执行Where 以过滤集合;到目前为止一切都很好(从课程开始有点奇怪,但无论如何)。条件是(英语),其中有MemberId 匹配“id”(无论来自哪里)的任何学生。不完全确定这会给你带来什么,但它不是学生的课程。

由于您已经拥有导航属性,您只需访问给定学生对象的Lessons 属性即可。假设您从学生 ID 开始,例如:

Students.FirstOrDefault(s => s.Id == id)?.Lessons;

FirstOrDefault 搜索正确的学生项目,然后您只需访问 Lessons 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多