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

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

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

第一步,先使用nuget安装entityframework

WPF 手写 EF CodeFirst 使用过程_ide

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

接下来就是写代码了

//命名空间随意,自行决定
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一遍流程已经完毕。其它表的添加和更新,都和这个表一样,尽情享受吧。