CODE-FIRST 实体编写

EF实体创建规范

1 说明

为了在界面操作和数据操作方便,整理出EF实体创建规范。后续持续进行文件更新。

(以下特性生成使用MVC4+EF6.1.3)

2 数据库特性描述

2.1 Key

[Key]

public int ID { getset; }

 

 

2.2 外键,注意外键和外键表的主键类型要一致。

 

public Identity Identity { getset; }

[ForeignKey("Identity")]

public int IdentityID { getset; }

 

 

2.3 唯一,创建唯一索引,只支持EF6.0以上版本。

[Index(IsUnique = true)]

public string OrderName { getset; }

 

 

2.4 字符串长度限制

 

[Key]

public string DefaultLength { getset; }

public string DefaultLength2 { getset; }

 

[Display(Name = "最大长度限制"), MaxLength(10)]

public string MaxLength { getset; }

 

[Display(Name = "最小长度"), MinLength(10)]

public string MinLength { getset; }

 

[Display(Name = "固定长度"), StringLength(10)]

public string StringLength { getset; }

 

[Display(Name = "长度范围"), Range(10, 20)]

public string StringRange{ getset; }

 

 

由此可以看出字符串生成的数据库字段:

1) DefaultLength,DefaultLength2,主键字符默认长度为128。普通字段字符串默认长度为max。

2) MaxLength设置有效和StringLength设置效果相同。

3) MinLength和Range设置无效。

2.5 需要或必须字段

 

[Required]

public string Name { getset; }

public string Name2 { getset; }

 

3 引用、聚合组合

3.1 引用

3.1.1 模型建立,在事例中创建了一个Hero(英雄)类,引用Areas(大区)和Identities(人员认证)类。

    /// <summary>

    /// 英雄

    /// </summary>

public class Hero

{

    …(此处省略1)

        [ForeignKey("Identity")]

        public int IdentityID { getset; }

        public Identity Identity { getset; }

 

        [ForeignKey("Area")]

        public int AreaID { getset; }

    public virtual Area Area { getset; }

}

    /// <summary>

    /// 游戏大区

    /// </summary>

    public class Area

    {

        public int ID { getset; }

        public string Location { getset; }

}

    /// <summary>

    /// 认证

    /// </summary>

    public class Identity

    {

        public int ID { getset; }

        public string UserName { getset; }

 }

 

3.1.2 不知道细心的同学注意没有,在Hero中的Area中有virtual,而在Identities中并没有virtual。

这里引出懒加载(LazyLoading)的问题,其实这个应该是从设置中去理解这个问题。如果该引用为强引用,在使用Hero时一定会用到Area则添加virtual,添加virtual之后,只要查询Hero就会联合查询出Area信息。如果为弱引用,在使用Hero时可能不使用Identities则不添加virtual。

测试:

1) 添加Areas数据

 

2) 添加Identities数据

 

3) 添加Hero数据

 

4) 将Hero中ID等于1的寒冰妹子查询出来。

 

using (AppDbContext dbc = new AppDbContext())

{

var hero = dbc.Heros.Where(h => h.ID == 1).SingleOrDefault();

}

 

  PS:经过测试EF5.0同样如此。

3.2 聚合组合(点我查看)

3.2.1 模型建立,在事例中创建了一个Hero(英雄)类,英雄有多个皮肤Face 和多个技能Skill。

(注意,在Skill类中和Face类中都可以添加对于Hero的外键,这样便于数据操作。)

 

    /// <summary>

    /// 英雄

    /// </summary>

    public class Hero

{

…(此处省略1)

        /// <summary>

        /// 技能集合

        /// </summary>

        public virtual ICollection<Skill> Skills { getset; }

 

        /// <summary>

        /// 皮肤集合

        /// </summary>

    public ICollection<Face> Faces { getset; }

}

    /// <summary>

    /// 技能

    /// </summary>

    public class Skill

    {

        public int ID { getset; }

        public string Name { getset; }

        public int HeroID { getset; }

 

        [ForeignKey("HeroID")]

        public Hero Hero { getset; }

    }    

/// <summary>

    /// 英雄皮肤

    /// </summary>

    public class Face

    {

        public int ID { getset; }

        public string Name { getset; }

        public int HeroID { getset; }

 

        [ForeignKey("HeroID")]

        public Hero Hero { getset; }

  }

 

3.2.2 同样从Hero中可以看出Skills添加了virtual,属于组合关系,而Faces没有添加属于聚合关系。组合关系(添加了virtual)在使用Hero时就加载了Skills数据。而聚合(未添加virtual)就没有加载数据,进行了懒加载(LazyLoading)。

测试:

1) 添加Face数据。

 

2) 添加Skill数据。

 

3) 将Hero中ID等于1的寒冰妹子查询出来。

 

using (AppDbContext dbc = new AppDbContext())

{

var hero = dbc.Heros.Where(h => h.ID == 1).SingleOrDefault();

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

三项超标

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值