EF里实体关系配置的方法

来源:互联网 发布:stn快报淘宝店 编辑:程序博客网 时间:2024/06/06 12:47

EF里的实体关系配置分为Has和With系列的方法:Optional 可选的、Required 必须的、Many 多个。举例:

/// <summary>
    /// 用户照片类
    /// </summary>
    public class PersonPhoto
    {
        [Key]
        public int PersonId { get; set; }
        public byte[] Photo { get; set; }
        public string Caption { get; set; }  //标题
        public Person PhotoOf { get; set; }
    }

当然,也需要给Person类添加PersonPhoto的导航属性,表示和PersonPhoto一对一的关系:

public PersonPhoto Photo { get; set; }


A.HasRequired(a => a.B).WithOptional(b => b.A);

这里的a=>a.B是lambda表示写法,就是找到A类里的导航属性B。命名a不固定,可以随意,q=>q.B也是可以的。但是B是A类的属性,故习惯用小写a。

Has方法:

  1. HasOptional:前者包含后者一个实例或者为null
  2. HasRequired:前者(A)包含后者(B)一个不为null的实例
  3. HasMany:前者包含后者实例的集合

With方法:

  1. WithOptional:后者(B)可以包含前者(A)一个实例或者null
  2. WithRequired:后者包含前者一个不为null的实例
  3. WithMany:后者包含前者实例的集合

上面一句配置意思就是A类包含B类一个不为null的实例,B类包含A类一个实例,也可以不包含。最标准的一对一配置。ok,现在试着写下上面Person类和PersonPhoto类的一对一的关系如何配置:

this.HasRequired(p => p.PhotoOf).WithOptional(p => p.Photo);

再跑下程序,数据库就生成了,是一对一的关系。Person表可以没有对应的PersonPhoto表数据,但是PersonPhoto表每一条数据都必须对应一条Person表数据。意思就是人可以没有照片,但是有的照片必须属于某个人。关系配置是这样的效果,其实可以随便改,也可以配置成每个人都必须有对应的照片。把上面的WithOptional改成WithRequired,对应到数据库里就是null变成了not null。


阅读全文
0 0
原创粉丝点击