Entity Framework Core-数据库优先

文章介绍了如何使用EFCore的数据库优先方法,通过SQLServer创建Company数据库及Employee和Department表,然后利用.NETCoreCLI或PMC命令生成对应的Entity和Context类。尽管数据库优先不被推荐,但此过程展示了数据库到C#模型的映射。
摘要由CSDN通过智能技术生成

数据库优先是EF Core会根据数据库自动创建Entity&Context,因此首先你得先创建数据库

我们通过一个Company数据库做个演示

1 SQL Server中创建数据库

在Visual Studio中打开View->SQL Sever Object Explorer,然后创建一个简单的数据库名称为Company,在数据库中创建两个表:

  • Employee

  • Department

Employee 表定义如下:

Department 表定义如下:

这两张表的Primary Key是Id列并且自增长

Department&Employee是一对多的关系,一个Department有多个Employee,我们在Employee表中创建DepartmentId列作为Department表的外键

创建表脚本

CREATETABLE [dbo].[Department](
    [Id] [int] IDENTITY(1,1) NOTNULL,
    [Name] [varchar](50) NOTNULL,
 CONSTRAINT [PK_Department] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
//Employee 表
CREATETABLE [dbo].[Employee](
    [Id] [int] IDENTITY(1,1) NOTNULL,
    [DepartmentId] [int] NOTNULL,
    [Name] [varchar](100) NOTNULL,
    [Designation] [varchar](25) NOTNULL,
 CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
(
    [Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTERTABLE [dbo].[Employee]  WITHCHECKADDCONSTRAINT [FK_Employee_Department] FOREIGNKEY([DepartmentId])
REFERENCES [dbo].[Department] ([Id])
GO
ALTERTABLE [dbo].[Employee] CHECKCONSTRAINT [FK_Employee_Department]
GO

2 Entity Framework Core数据库连接字符串

数据库连接字符串包含了数据源以及一些必要的连接信息,EF Core需要连接字符串和数据库进行交互,指定数据库操作像新增,读取等,打开SQL Sever Object Explorer,鼠标选中数据库,右击属性,在属性窗体中找到Connection String并且复制该值

数据库连接字符串是:

Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Company;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False

3 .NET Core CLI Scaffold 命令

在Package Manager Console 窗体中运行CLI Scaffold命令,在Visual Studio 中打开Tools->NuGet Package Manager->Package Manager Console 菜单

运行之前请确保你在项目中已经安装了EF Core 相关工具链,运行命令如下:

dotnet ef dbcontext scaffold "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Company;Integrated Security=True;" Microsoft.EntityFrameworkCore.SqlServer -o Models

解释:

  • 双引号内指定了数据库连接字符

  • Microsoft.EntityFrameworkCore.SqlServer指定了使用SQL Server的Provider

  • -o Models  指定了生成Entity & Context 类的目录名称

这个命令需要执行10-20秒,执行完之后我们可以看到生成的类

3.1 Context & Entity 类

我们发现在Models 目录下生成了context & entity类

 

3.2 Employee类

publicpartialclassEmployee
{
    publicint Id { get; set; }
    publicint DepartmentId { get; set; }
    publicstring Name { get; set; } = null!;
    publicstring Designation { get; set; } = null!;
    publicvirtual Department Department { get; set; } = null!;
}

3.3 Department类

publicpartialclassDepartment
{
    publicint Id { get; set; }
    publicstring Name { get; set; } = null!;
    publicvirtual ICollection<Employee> Employees { get; } = new List<Employee>();
}

3.4 CompanyContext类

publicpartialclassCompanyContext : DbContext
{
    public CompanyContext()
    {
    }
    public CompanyContext(DbContextOptions<CompanyContext> options)
        : base(options)
    {
    }
    publicvirtual DbSet<Department> Departments { get; set; }
    publicvirtual DbSet<Employee> Employees { get; set; }
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
#warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263.
        => optionsBuilder.UseSqlServer("Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=Company;Integrated Security=True;");
    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Department>(entity =>
        {
            entity.ToTable("Department");

            entity.Property(e => e.Name)
                .HasMaxLength(50)
                .IsUnicode(false);
        });
        modelBuilder.Entity<Employee>(entity =>
        {
            entity.ToTable("Employee");

            entity.Property(e => e.Designation)
                .HasMaxLength(25)
                .IsUnicode(false);
            entity.Property(e => e.Name)
                .HasMaxLength(100)
                .IsUnicode(false);

            entity.HasOne(d => d.Department).WithMany(p => p.Employees)
                .HasForeignKey(d => d.DepartmentId)
                .OnDelete(DeleteBehavior.ClientSetNull)
                .HasConstraintName("FK_Employee_Department");
        });
        OnModelCreatingPartial(modelBuilder);
    }
    partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
}

4 PMC Scaffold-DbContext 命令

我们能跳过dotnet cli scaffold 命令,在Package Manager Console 中使用Scaffold-DbContext 命令从数据库中创建Context & Entity 类,这个和上面的完全相同,在Package Manager Console 中运行如下命令

Scaffold-DbContext "Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=Company;Integrated Security=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

总结

这节我们主要学习 Entity Framework Core 数据库优先,以及使用脚手架命令根据数据库生成对应的Entity & Context,然而,数据库优先是不被推荐的,Microsoft建议我们使用代码优先方法 在下一节中我们将了解DbContext 类

参考资料

[1]

https://www.yogihosting.com/database-first-approach-entity-framework-core/

原文地址 

在使用Winform和Entity Framework Core进行多数据库操作时,我们需要注意以下几个方面。 首先,需要在项目中引入Entity Framework Core的相关包。 接下来,在创建DbContext时,我们需要根据具体的数据库类型(例如MySQL、SQL Server等)来选择不同的数据库提供程序。可以通过在DbContext的构造函数中传入相应的数据库连接字符串来实现。 在操作数据库时,可以使用Entity Framework Core提供的数据库迁移功能来自动创建数据库表和更新数据库结构。通过运行`add-migration`和`update-database`命令,可以根据实体类的变化来自动创建表和更新数据库。 在多数据库操作时,我们需要为每个数据库定义独立的DbContext,并在业务代码中根据具体需求使用不同的DbContext进行操作。 需要注意的是,在使用多数据库时,我们还需要考虑事务管理的问题。可以使用Entity Framework Core提供的`Database.BeginTransactionAsync`方法来开启一个事务,然后在事务中执行多个数据库操作。 另外,为了便于管理和维护代码,我们可以将操作不同数据库的代码封装为不同的服务或仓储类,并使用依赖注入来注入具体的实现。这样可以提高代码的可读性和可维护性。 总结来说,使用Winform和Entity Framework Core进行多数据库操作需要注意选择合适的数据库提供程序、定义独立的DbContext、使用数据库迁移来管理数据库结构、注意事务管理,并将代码进行封装和依赖注入,以提高代码的可读性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值