• Entity Framework 实体之间的关系总结——1:0,1:1,1:n,m:n关系


    学这个地方的时候就是一知半解,这次做这个项目让我好好学习了一下。

    http://www.cnblogs.com/dudu/tag/Entity%20Framework%20%E5%AE%9E%E8%B7%B5%E7%B3%BB%E5%88%97/感谢

    这里的a=>a.B是lambda表示写法,就是找到属性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。

    思考:我们并没有像之前一样添加一个实体类就同时添加到BreakAwayContext类中,但是为何照样能在数据库中生成PersonPhotos表?
    解答:添加到BreakAwayContext类中是让数据库上下文能跟踪到这个类,方便进行CRUD(增查改删)。这里我们不把PersonPhoto类添加到BreakAwayContext类中是因为我们并不会去单独增删改查PersonPhoto类,对PersonPhoto类的操作都是先找Person类,然后通过一对一的关系找到PersonPhoto类,这个比较符合实际情况。数据库中能生成PersonPhotos就更好理解了,因为我们有这个实体类嘛。
    继续思考:到这里大家肯定又会想了,如果只需要加入主键类到BreakAwayContext类中,那么其他什么一对多,多对多的关系是不是都只要加主键表到BreakAwayContext类中呢?
    继续解答:还是需要根据实际情况考虑,上面的PersonPhoto类已经解释过了,实际情况中不太可能单独操作PersonPhoto类。一对多关系里Logding住宿类是外键表,这个想想也知道必须要让数据库上下文跟踪到,因为我们太可能直接操作Lodging住宿类了。比如前台添加一个搜索住宿的功能,那是不是需要直接操作此外键表了呢?肯定需要了。所以还是需要根据实际情况考虑。这里仅是个人观点,如有瑕疵,恳请指正。

    http://www.th7.cn/Program/net/201308/146097.shtml

  • 相关阅读:
    django使用redis
    Python连接redis
    Redis 字符串(String)
    Redis 列表(List)
    Redis 集合(Set)
    Redis 哈希(Hash)
    Python获取时间范围
    如何查看oracle当前连接数,会话数
    python装饰器
    windows通过ssh连接虚拟机中的ubuntu步骤
  • 原文地址:https://www.cnblogs.com/myis55555/p/6792183.html
Copyright © 2020-2023  润新知