EF实体间多对多的关系

来源:互联网 发布:淘宝开内衣店店铺简介 编辑:程序博客网 时间:2024/05/20 17:42

添加一个活动类Activity,跟旅行类Trip是多对多的关系。这个也不难理解:一个旅行有多个活动,一个活动可以属于多个旅行。

复制代码
    /// <summary>    /// 活动类    /// </summary>    public class Activity    {        public int ActivityId { get; set; }        //[Required, MaxLength(50)]        public string Name { get; set; }        public List<Trip> Trips { get; set; }    //和Trip类是多对多关系    }
复制代码

跟之前的一样在BreakAwayContext类里添加Activity类,让数据库上下文知道Activity类:

public DbSet<CodeFirst.Model.Activity> Activitys { get; set; }

同时在Trip旅行类里添加上导航属性,形成跟Activity活动类的多对多关系

 public List<Activity> Activitys { get; set; }

ok,已经可以了,跑下程序得到如下数据库:

可以看出,EF里的多对多关系是由第三张表来连接两个表的。ActivityTrips表连接了Activityes表和Trips表。表名列名都是默认命名,都可以自己配置。文章的开头已经说了那么多了,多对多肯定是用HasMany和WithMany方法,在ActivityMap类里写下如下Fluent API:

复制代码
            this.HasMany(a => a.Trips).WithMany(t => t.Activitys).Map(m =>                {                    m.ToTable("TripActivities");      //中间关系表表名                    m.MapLeftKey("ActivityId");        //设置Activity表在中间表主键名                    m.MapRightKey("TripIdentifier");   //设置Trip表在中间表主键名                });
复制代码

同样也可以在TripMap里配置,顺序不一样罢了:

复制代码
            this.HasMany(t => t.Activities).WithMany(a => a.Trips).Map(m =>            {                m.ToTable("TripActivities");    //中间关系表表名                m.MapLeftKey("TripIdentifier");   //设置Activity表在中间表的主键名                m.MapRightKey("ActivityId");    //设置Trip表在中间表的主键名            });
复制代码

两种配置任选其一就可以了,重新跑下程序就可以了。都配置好了在程序里如何读取这个对多对的数据呢,简单写一句:

var tripWithActivities = context.Trips.Include("Activities").FirstOrDefault();
是不是也需要考虑性能的问题呢?如果只需要修改主表的某个列,那贪婪加载出相关联的从表数据做什么?会发送很多冗余的sql到数据库。当然如果要根据主表找从表数据的话,这么加载也是好事,超级方便。
阅读全文
0 0
原创粉丝点击