创建模型

2019-04-04 17:40 更新
TopBasePoco

TopBasePoco是框架所有模型的基类,它只定义了一个Guid的主键,所有其他模型都必须直接或间接继承TopBasePoco,否则框架的其他自动化操作无法执行

这意味着框架只支持Guid为唯一主键的数据库设计,虽然不同的人对此有不同的看法,但其实任何表的设计都不妨碍再加一个Guid的主键

BasePoco

BasePoco是框架所有内置模型的基类,它在TopBasePoco的基础上增加了创建人,修改人,创建时间和修改时间四个字段,对于大多数模型,这些字段都是需要的

建议用户自定义的模型都继承BasePoco

框架自带的添加和修改操作会自动更新创建人,修改人,创建时间和修改时间这些字段

PersistPoco

PersistPoco在BasePoco的基础上增加了IsValid字段,指示框架对这类模型进行假删除

框架自带的删除功能会自动将继承PersistPoco的模型的IsValid字段设为false,而不会真正删除它

一对多和多对多

模型之间的一对多和多对多的关系完全遵从EF Core默认的规则

初次使用者容易忘记定义外键名称,比如定义了一个指向School类的属性叫做ParentSchool,那么必须有一个叫做ParentSchoolId的guid属性定义外键名称,这是EF Core的默认规则

如果不定义这个加Id的字段,虽然数据库可以生成,但是在代码层面是不知道外键名称的,框架的代码生成器也就无法正常工作

其他
框架除了要求模型必须最终继承自TopBasePoco之外,没有其他额外要求。只要遵循EF Core的方式创建模型类就可以
示例

以下代码创建了一个学校模型,一个专业模型和一个学生模型

学校和专业之间是一对多的关系,学生和专业之间是多对多的关系,通过中间表StudentMajor关联

请注意这些关联关系的定义,比如School和ShoolId,Major和MajorId,Student和StudentId这些都是成对出现的

StudentMajor模型上的[MiddleTable]标记,表示这是一张多对多的中间表,在中间表上加[MiddleTable]可以让代码生成器识别多对多的关系并生成正确的代码

  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Text;
  5. using WalkingTec.Mvvm.Core;
  6. namespace FirstProject.Model
  7. {
  8. public enum SchoolTypeEnum {
  9. [Display(Name = "公立学校")]
  10. PUB,
  11. [Display(Name = "私立学校")]
  12. PRI
  13. }
  14. public class School : BasePoco
  15. {
  16. [Display(Name = "学校编码")]
  17. [Required(ErrorMessage = "{0}是必填项")]
  18. [RegularExpression("^[0-9]{3,3}$", ErrorMessage = "{0}必须是3位数字")]
  19. [StringLength(3)]
  20. public string SchoolCode { get; set; }
  21. [Display(Name = "学校名称")]
  22. [StringLength(50, ErrorMessage = "{0}最多输入{1}个字符")]
  23. [Required(ErrorMessage = "{0}是必填项")]
  24. public string SchoolName { get; set; }
  25. [Display(Name = "学校类型")]
  26. [Required(ErrorMessage = "{0}是必填项")]
  27. public SchoolTypeEnum? SchoolType { get; set; }
  28. [Display(Name = "备注")]
  29. public string Remark { get; set; }
  30. }
  31. public class Major : BasePoco
  32. {
  33. [Display(Name = "专业编码")]
  34. [Required(ErrorMessage = "{0}是必填项")]
  35. [RegularExpression("^[0-9]{3,3}$", ErrorMessage = "{0}必须是3位数字")]
  36. public string MajorCode { get; set; }
  37. [Display(Name = "专业名称")]
  38. [StringLength(50, ErrorMessage = "{0}最多输入{1}个字符")]
  39. [Required(ErrorMessage = "{0}是必填项")]
  40. public string MajorName { get; set; }
  41. [Display(Name = "备注")]
  42. public string Remark { get; set; }
  43. [Display(Name = "所属学校")]
  44. [Required()]
  45. public Guid? SchoolId { get; set; }
  46. [Display(Name = "所属学校")]
  47. public School School { get; set; }
  48. [Display(Name = "学生")]
  49. public List<StudentMajor> StudentMajors { get; set; }
  50. }
  51. public class Student : BasePoco
  52. {
  53. [Display(Name = "账号")]
  54. [Required(ErrorMessage = "{0}是必填项")]
  55. [StringLength(50, ErrorMessage = "{0}最多输入{1}个字符")]
  56. public string LoginName { get; set; }
  57. [Display(Name = "密码")]
  58. [Required(AllowEmptyStrings = false)]
  59. [StringLength(32)]
  60. public string Password { get; set; }
  61. [Display(Name = "姓名")]
  62. [Required(ErrorMessage = "{0}是必填项")]
  63. [StringLength(50, ErrorMessage = "{0}最多输入{1}个字符")]
  64. public string Name { get; set; }
  65. [Display(Name = "手机")]
  66. [RegularExpression("^[1][3,4,5,7,8][0-9]{9}$", ErrorMessage = "{0}格式错误")]
  67. public string CellPhone { get; set; }
  68. [Display(Name = "邮编")]
  69. [RegularExpression("^[0-9]{6,6}$", ErrorMessage = "{0}必须是6位数字")]
  70. public string ZipCode { get; set; }
  71. [Display(Name = "日期")]
  72. public DateTime? EnRollDate { get; set; }
  73. [Display(Name = "专业")]
  74. public List<StudentMajor> StudentMajor { get; set; }
  75. }
  76. [MiddleTable]
  77. public class StudentMajor : BasePoco
  78. {
  79. public Major Major { get; set; }
  80. public Student Student { get; set; }
  81. public Guid MajorId { get; set; }
  82. public Guid StudentId { get; set; }
  83. }
  84. }


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号