手写 EF CodeFirst 使用过程

废话不多说了,直接上代码

EF之code first模式,我理解就是先写代码,让代码自动帮你生成数据库表。

为了方便,我把所有代码都写在一个类文件中,加上注释,尽量做到都能看懂。

第一步,先使用nuget安装entityframework

image

这个库只需要安装即可,无需其它操作

接下来就是写代码了

//命名空间随意,自行决定
namespace ORM {
  //添加一个实体类,就是数据表对应的c#类型,
  public class StudentEntity
  {
    public int key { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }
  }
  //添加一个Mapper,用于生成表时,查找对应的表名
  public class EntityToTableMapper<T>:EntityTypeConfiguration<T>
        where T:class,new()
    {
        public EntityToTableMapper()
        {
            ToTable(EntityToTableHelper.GetTableName(typeof(T)));
        }
    }
  //添加maphelper,这个类在座上面添加的实体类型和表名的对应关系
  public class EntityToTableHelper
    {
        private static Dictionary<Type, string> m_typeToTable = new Dictionary<Type, string>();
        static EntityToTableHelper()
        {
            m_typeToTable[typeof(StudentEntity)] = "Students";
        }
        public static string GetTableName(Type entityType)
        {
            if (m_typeToTable.Keys.Contains(entityType))
            {
                return m_typeToTable[entityType];
            }
            throw new ApplicationException("找不到对象对应的表名! 请检查是否在ORM工程中设置了实体和表的映射关系.");
        }
    }
  //添加一个实体类Map,添加表字段字段约束相关信息
  public class StudentEntityMap:EntityToTableMapper<StudentEntity>
    {
        public StudentEntityMap()
        {
            HasKey(p => p.key);
            Property(p => p.Age).IsRequired();
            Property(p => p.Name).IsRequired();
        }
    }
  //添加一个context,所有操作都在这里面实现
  public class GDataContext:DbContext
    {
        public static string connStr { get; set; } = $"";//连接字符串
        public GDataContext()
            :base(connStr)
        {
            
        }
        //创建一个数据库对象
        public virtual DbSet<StudentEntity> Students { get; set; }
        //重写生成表的方法,用我们自定义的个情况生成
        protected override void OnModelCreating(DbModelBuilder modelBuilder)
        {
            var typesRegister = Assembly.GetExecutingAssembly().GetTypes()
                .Where(type => type.BaseType != null
                    && type.BaseType.IsGenericType
                    && type.BaseType.GetGenericTypeDefinition() == typeof(EntityToTableMapper<>));
            foreach (var type in typesRegister)
            {
                dynamic configurationInstance = Activator.CreateInstance(type);
                modelBuilder.Configurations.Add(configurationInstance);
            }
        }
    }
}

安装完entityframework后,配置文件大概是这个样子的,对照看一下,一般不用更改

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
        <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
        <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    </configSections>
  <entityFramework>
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework">
      <parameters>
        <parameter value="System.Data.SqlClient" />
      </parameters>
    </defaultConnectionFactory>
  </entityFramework>
</configuration>

新建一个测试类:

class Test{
  public void test insert(){
            //使用demo
            var student = new StudentEntity()
            {
                key = 1,
                Age = 19,
                Name = "tttdddd"
            };
            using (GDataContext context = new GDataContext())
            {
                context.Students.Add(student);
                context.SaveChanges();
            }
            MessageBox.Show("666");
  }
}

此时,ef codefirst一遍流程已经完毕。其它表的添加和更新,都和这个表一样,尽情享受吧。

© 版权声明
THE END
喜欢就支持一下吧
点赞9 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情

    暂无评论内容