【手撸一个ORM】第一步、约定和实体描述

一、约定

  1. 目标数据库:SqlServer2008及以上
  2. 数据实体必须实现IEntity接口,该接口定义了一个int类型的Id属性,既每个实体必须有一个名称为Id的自增主键

二、IEntity接口

namespace MyOrm.Commons
{
    public interface IEntity
    {
        int Id { get; set; }
    }
}

三、实体描述

  1. MyTableAttribute,用于约定实体和数据表的关联关系,若实体名称和数据表名一直,可省略此描述
  2. MyKeyAttribute,用于约定实体的主键,若数据表主键名称不是Id,可通过此描述约定Id属性映射的数据表的主键名
  3. MyColumnAttribute,此描述用法较多:InsertIgnore 插入时忽略此属性;UpdateIgnore 更新时忽略此属性;Ignore 插入和更新时忽略该属性;ColumnName 若属性名和列名不一致,使用此属性约定映射的数据表列名
  4. MyForeignKeyAttribute,ForeignKey 用于约定导航属性和外键列,若外键名不为 “导航属性名 + Id”,则需要通过此描述进行约定。
using System;

namespace MyOrm.Attributes
{
    [AttributeUsage(AttributeTargets.Class)]
    public class MyTableAttribute : Attribute
    {
        public string TableName { get; }

        public MyTableAttribute(string tableName)
        {
            TableName = tableName;
        }
    }

    [AttributeUsage(AttributeTargets.Property)]
    public class MyKeyAttribute : Attribute
    {
        public bool IsIncrement { get; set; } = true;

        public string FieldName { get; set; }
    }

    [AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
    public class MyColumnAttribute : Attribute
    {
        /// <summary>
        /// 对应数据表中的字段名
        /// </summary>
        public string ColumnName { get; set; }

        public bool Ignore { get; set; }

        public bool InsertIgnore { get; set; }

        public bool UpdateIgnore { get; set; }
    }

    [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)]
    public class MyForeignKeyAttribute : Attribute
    {
        public string ForeignKey { get; set; }

        public string MasterKey { get; set; } = "Id";

        public MyForeignKeyAttribute(string foreignKey)
        {
            ForeignKey = foreignKey;
        }
    }
}

三、示例:

using MyOrm.Attributes;
using MyOrm.Commons;
using System;

namespace ConsoleApp1
{
    // 实体对应的数据表名为 Base_Student
    [MyTable("Base_Student")]
    public class Student : IEntity
    {
        // 数据表的主键名称为StudentId
        [MyKey(FieldName = "StudentId")]
        public int Id { get; set; }

        public string StudentName { get; set; }

        public string Mobile { get; set; }

        public string Card { get; set; }

        public string State { get; set; }

        public DateTime? Birthday { get; set; }

        // 更新时忽略学校Id
        [MyColumn(UpdateIgnore = true)]
        public int FKSchoolId { get; set; }

        // 是否删除字段只能通过 Delete 方法修改,Update时需忽略该属性
        [MyColumn(UpdateIgnore = true)]
        public bool IsDel { get; set; }

        // 创建时间和创建人只在创建时指定,其他时候不能修改
        [MyColumn(UpdateIgnore = true)]
        public DateTime CreateAt { get; set; }

        [MyColumn(UpdateIgnore = true)]
        public string CreateBy { get; set; }

        public DateTime UpdateAt { get; set; }

        public string UpdateBy { get; set; }

        // 导航属性的外键为 FKSchoolId,若不指定,默认为SchoolId
        [MyForeignKey("FKSchoolId")]
        public School School { get; set; }
    }
}

猜你喜欢

转载自www.cnblogs.com/diwu0510/p/10663275.html