19、创建CodeFirst2
1、新建一个控制台项目
也可以是asp.net的Web项目,如:mvc或者webapi等。
在该项目所在解决方案里再建一个Models文件夹,然后在文件夹里建一个Models类库,如图:
打开nuget包,安装EF所需要的包到Models类库里。
2、在类库里建立实体类
这里只创建一个基本实体类BaseEntity和一个实体UserInfo实体举例:
BaseEntity.cs
namespace Models
{
/// <summary>
/// 基础类
/// </summary>
public class BaseEntity
{
/// <summary>
/// 主键
/// </summary>
public Guid Id { get; set; } = Guid.NewGuid();
/// <summary>
/// 是否被软删除
/// </summary>
public bool IsRemove { get; set; }
}
}
UserInfo类,继承BaseEntity
namespace Models
{
public class UserInfo:BaseEntity
{
[Required]
public string UserName { get; set; }
public string Sex { get; set; }
public int Age { get; set; }
}
}
3、建立EF上下文对象
创建一个ShopContext.cs类当做上下文对象
namespace Models
{
public class ShopContext:DbContext
{
public ShopContext():base("name=FirstCodeFirstApp")
{
}
//注册用户实体
DbSet<UserInfo> UserInfo { get; set; }
}
}
4、进行配置连接字符串
控制台项目配置在appconfig配置文件里,web项目配置在webconfig配置文件里。netCore的Web项目配置在appsettings.json配置文件里。
因为是sqlserver我是windows身份验证,所以配置的连接字符串如下:
<connectionStrings>
<add name="FirstCodeFirstApp" connectionString="server=.;Initial Catalog=EFLearn;Integrated Security=True; " providerName="System.Data.SqlClient" />
</connectionStrings>
5、进行自动数据库迁移
选择EF上下文对象和实体所在的项目
初始化迁移文件夹
Enable-Migrations –EnableAutomaticMigrations
可以看到会给你生成一个文件夹
里面的类里的配置方法里的自动迁移是开起的,所以可以直接进行数据库迁移
执行更新
Update-Database
执行成功:
修改实体字段
这里我们添加一个属性
[StringLength(128)]
public string Hobby { get; set; }
再次更新即可Update-Database
修改字段长度
[StringLength(64)]
public string Hobby { get; set; }
这时候我们再次进行自动更新,发现无法自动更新
因为,它怕数据丢失,所以要先创建一个快照,证明是不是EF自己更新导致字段长度改变后数据丢失。
创建一个快照
Add-migration name
如:
Add-migration change_1
生成:
然后再执行Update-Database
自动更新即可。
进行数据库迁移时遇到的错误
1、
No connection string named 'FirstCodeFirstApp' could be found in the application config file.
原因:在类库里写的app.config配置文件里的链接字符串在进行数据库迁移时并没有读取,而是去读取了控制台应用的配置文件了,所以将链接字符串放在控制台应用的配置文件里即可。
2、
The connection string 'FirstCodeFirstApp' in the application's configuration file does not contain the required providerName attribute."
原因:链接字符串里的配置项没有providerName属性
3、
Models.UserInfo: : EntityType 'UserInfo' has no key defined. Define the key for this EntityType.
UserInfo: EntityType: EntitySet 'UserInfo' is based on type 'UserInfo' that has no keys defined.
原因:一开始UserInfo实体没有继承BaseEntity基础类,所以没有主键。
4、
自动更新被关闭了。设置为true再更新即可