entity framework code first many to many add/update/delete/select

不老的童话 2013-04-02 05:23:16
entity framework code first many to many add/update/delete/select求实例讲解,主要是删除,不要什么级联删除,要代码实现(include)。最好是三个表以上。
...全文
277 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
不老的童话 2013-04-10
  • 打赏
  • 举报
回复
MVC3+EF4.1+CODE FIRST 实例代码源码http://item.taobao.com/item.htm?spm=a1z10.1.w188752522.16.KPcfp4&id=24001536207
不老的童话 2013-04-08
  • 打赏
  • 举报
回复
引用 12 楼 soladyk 的回复:
评论: 首先,个人觉得楼主的建模以及思路是有点问题的,如果有具体的场景,希望楼主能放上来另起个话题讨论下。 看看能否简化需求 其次,有些缺点希望楼主知道: 1.new Teacher 的方法,为了满足楼主一个主类teacher中包含两个Collection(Students和Course) 以及删除需求的时候,用了上述不良代码,比较好的代码如下: ……
非常感谢 希望以后能多交流
不老的童话 2013-04-08
  • 打赏
  • 举报
回复
引用 12 楼 soladyk 的回复:
评论: 首先,个人觉得楼主的建模以及思路是有点问题的,如果有具体的场景,希望楼主能放上来另起个话题讨论下。 看看能否简化需求 其次,有些缺点希望楼主知道: 1.new Teacher 的方法,为了满足楼主一个主类teacher中包含两个Collection(Students和Course) 以及删除需求的时候,用了上述不良代码,比较好的代码如下: ……
你用的是EF几啊,我用EF5.0就报错,请检查是否未使用 Ignore 方法或 NotMappedAttribute 数据注释显式排除该类型。验证该类型是否定义为类,不是基元、嵌套或泛型类型,并且不从 EntityObject 继承。
不老的童话 2013-04-07
  • 打赏
  • 举报
回复
引用 7 楼 soladyk 的回复:
下午请假回家,到周末都没办法上网了。工作中,没法给你例子。 大概给你个思路: 首先你的1对多关系必须设为optional而不是required,删除的时候遍历两个从表,把相应的数据删掉(千万别在主表的collection里用remove,这样不会真正删除数据),最后删主表的相应记录。
不知道你来了没,希望你能再教教我
熊猫无敌 2013-04-07
  • 打赏
  • 举报
回复
评论: 首先,个人觉得楼主的建模以及思路是有点问题的,如果有具体的场景,希望楼主能放上来另起个话题讨论下。 看看能否简化需求 其次,有些缺点希望楼主知道: 1.new Teacher 的方法,为了满足楼主一个主类teacher中包含两个Collection(Students和Course) 以及删除需求的时候,用了上述不良代码,比较好的代码如下: var teacher = new Teacher() { Name = "T1", Students = new List<Student>() { new Student() { Name = "S1", Courses = new List<Course>() { new Course() { Name = "C1" } } }, }; 2. 删除数据的时候,该方法会把所有数据加载到内存然后再删除,由于时间太晚,我就怎么简单怎么写了,可能还会有其它问题在代码中 3. 推荐http://stackoverflow.com/questions/6141988/ef-4-1-loading-filtered-child-collections-not-working-for-many-to-many,如果楼主有兴趣,要把Collection, Query, Load, Include这些重要函数看懂
熊猫无敌 2013-04-07
  • 打赏
  • 举报
回复
简单的测试代码:
        private static void TestTeacher()
        {
            var courses = new List<Course>() { new Course() { Name = "C1" } };

            var teacher = new Teacher()
            {
                Name = "T1",
                Students = new List<Student>()
                {
                    new Student() { Name = "S1", Courses = courses }
                },
                Courses = courses
            };

            using(var context = new BreakAwayContext())
            {
                context.Teachers.Add(teacher);
                context.SaveChanges();
            }

            using (var context = new BreakAwayContext())
            {
                var updatedTeacher = context.Teachers.Include(x=>x.Students).Include(x=>x.Courses).First(x => x.Name == "T1");
                updatedTeacher.Name = "T2";
                context.SaveChanges();
            }

            using (var context = new BreakAwayContext())
            {
                var deletedTeacher = context.Teachers.Include(x => x.Students).Include(x => x.Courses).First(x => x.Name == "T2");

                foreach (var s in context.Courses.Where(x => x.Teacher.Id == deletedTeacher.Id))
                {
                    context.Courses.Remove(s);
                }
                foreach (var c in context.Students.Where(x => x.Teacher.Id == deletedTeacher.Id))
                {
                    context.Students.Remove(c);
                }

                context.Teachers.Remove(deletedTeacher);
                context.SaveChanges();
            }
        }
熊猫无敌 2013-04-07
  • 打赏
  • 举报
回复
MODEL:
    public class Teacher
    {
        public int Id { get; set; }
        public string Name { get; set; } 
        public List<Course> Courses { get; set; }
        public List<Student> Students { get; set; } 
    }

    public class Course
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Teacher Teacher { get; set; }
        public List<Student> Students { get; set; }
    }

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public Teacher Teacher { get; set; }
        public List<Course> Courses { get; set; }
    }
不老的童话 2013-04-03
  • 打赏
  • 举报
回复
引用 7 楼 soladyk 的回复:
下午请假回家,到周末都没办法上网了。工作中,没法给你例子。 大概给你个思路: 首先你的1对多关系必须设为optional而不是required,删除的时候遍历两个从表,把相应的数据删掉(千万别在主表的collection里用remove,这样不会真正删除数据),最后删主表的相应记录。
那我先试着做一下,还是等你有空教一下,麻烦你了,先谢谢了。
熊猫无敌 2013-04-03
  • 打赏
  • 举报
回复
下午请假回家,到周末都没办法上网了。工作中,没法给你例子。 大概给你个思路: 首先你的1对多关系必须设为optional而不是required,删除的时候遍历两个从表,把相应的数据删掉(千万别在主表的collection里用remove,这样不会真正删除数据),最后删主表的相应记录。
不老的童话 2013-04-03
  • 打赏
  • 举报
回复
引用 3 楼 soladyk 的回复:
这个是我拿来写的,再多放不上来了,楼主自己努力,测过可用 C# code?12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061<br sab="255"> public class Cours……
希望你能再帮我解答一下
不老的童话 2013-04-03
  • 打赏
  • 举报
回复
soladyk 感谢你的回答,不过我有个疑问望你能解答,就是我想一个主表一对多,其他两个表多对多,其他两个表和主表有导航属性,我想删除主表一条信息其他两个表的内容也删除,不要级联删除,怎么实现?
不老的童话 2013-04-03
  • 打赏
  • 举报
回复
谢谢啊,我学习学习
熊猫无敌 2013-04-02
  • 打赏
  • 举报
回复
这个是我拿来写的,再多放不上来了,楼主自己努力,测过可用

    public class Course
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Student> Students { get; set; }
    }

    public class Student
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public List<Course> Courses { get; set; }
    }

          


using (var context = new BreakAwayContext())
            {
                var student = new Student()
                {
                    Name = "Ray",
                    Courses = new List<Course>() { 
                        new Course() { Name = "Math" },
                        new Course() { Name = "English" }
                    }
                };

                context.Students.Add(student);
                context.SaveChanges();

                Assert.AreEqual(1, context.Students.Where(x => x.Name == "Ray").Count());
            }

            //Update
            using (var context = new BreakAwayContext())
            {
                var student = (from d in context.Students.Include(x => x.Courses)
                               where d.Name == "Ray"
                               select d).Single();

                student.Courses.Add(new Course() { Name = "Computer Science"} );
                context.SaveChanges();

                //Assert.AreEqual(0, context.Husbands.Where(x => x.Name == "A").Count());
                Assert.AreEqual(3, context.Courses.Count());
            }

            //Delete
            using (var context = new BreakAwayContext())
            {
                var student = (from s in context.Students
                               where s.Name == "Ray"
                               select s).Single();

                context.Students.Remove(student);
                context.SaveChanges();
                Assert.AreEqual(0, context.Students.Where(x => x.Name == "Ray").Count());
            }

不老的童话 2013-04-02
  • 打赏
  • 举报
回复
版主 坛主 各位高手 多多指教
不老的童话 2013-04-02
  • 打赏
  • 举报
回复
希望大家能给点建议

62,025

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧