19、创建CodeFirst2

1、新建一个控制台项目

也可以是asp.net的Web项目,如:mvc或者webapi等。

在该项目所在解决方案里再建一个Models文件夹,然后在文件夹里建一个Models类库,如图:

image

打开nuget包,安装EF所需要的包到Models类库里。
image

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、进行自动数据库迁移

image

选择EF上下文对象和实体所在的项目
image

初始化迁移文件夹

Enable-Migrations –EnableAutomaticMigrations

可以看到会给你生成一个文件夹
image

里面的类里的配置方法里的自动迁移是开起的,所以可以直接进行数据库迁移
image

执行更新

Update-Database

执行成功:
image


修改实体字段

这里我们添加一个属性

        [StringLength(128)]
        public string Hobby { get; set; }

再次更新即可Update-Database

修改字段长度

 [StringLength(64)]
        public string Hobby { get; set; }

这时候我们再次进行自动更新,发现无法自动更新
image

因为,它怕数据丢失,所以要先创建一个快照,证明是不是EF自己更新导致字段长度改变后数据丢失。

创建一个快照
Add-migration name
如:
Add-migration change_1

生成:
image

然后再执行Update-Database自动更新即可。


进行数据库迁移时遇到的错误

1、

No connection string named 'FirstCodeFirstApp' could be found in the application config file.

image

原因:在类库里写的app.config配置文件里的链接字符串在进行数据库迁移时并没有读取,而是去读取了控制台应用的配置文件了,所以将链接字符串放在控制台应用的配置文件里即可。

2、

The connection string 'FirstCodeFirstApp' in the application's configuration file does not contain the required providerName attribute."
image

原因:链接字符串里的配置项没有providerName属性
image

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.
image

原因:一开始UserInfo实体没有继承BaseEntity基础类,所以没有主键。

4、

image

自动更新被关闭了。设置为true再更新即可
image

posted @ 2022-06-30 10:31  青仙  阅读(35)  评论(0编辑  收藏  举报