C#中.NET Framework4.8 Windows窗体应用通过EF访问新建数据库

目录

一、 操作步骤

二、编写EF模型和数据库上下文

三、 移植(Migrations)数据库

四、编写应用程序

五、生成效果


        前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 

        本文想说的是,.NET Framework4.8 Windows窗体应用通过EF访问新建数据库,这里的数据据库要根据事先编写好的EF模型、和数据库上下文,经过一番操作,移植(Migrations)出来的。这个数据库在“工具、连接到数据库”是看不到这个数据库的连接的。

一、 操作步骤

  • 新建VS.NET Framework4.8 Windows窗体应用;

  • 安装适合版本的EF程序包,3.1.32.0;
  • 编写EF模型和数据库上下文,文件录入格式是添加新的类;
  • 移植(Migrations)数据库,资源管理器里生成Migrations夹;
  • 编写应用程序文件Form1.cs;
  • 运行;

        步骤1和步骤2作者以前的文章都讲过,不再重复叙述。

二、编写EF模型和数据库上下文

        添加→新建项目→类,复制粘贴以下全文,一定要保证所有.cs文件在同一片空间下(namespace)。

//编写EF模型和数据库上下文
using Microsoft.EntityFrameworkCore;
using System.Collections.Generic;

namespace _10_14
{
    public class BloggingContext : DbContext
    {
        public DbSet<Blog> Blogs { get; set; }
        public DbSet<Post> Posts { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(@"Server=(localdb)\mssqllocaldb;Database=EFGetStarted.ConsoleApp.NewDb;Trusted_Connection=True;");
        }
    }

    public class Blog
    {
        public int BlogId { get; set; }
        public string Url { get; set; }

        public List<Post> Posts { get; set; }
    }

    public class Post
    {
        public int PostId { get; set; }
        public string Title { get; set; }
        public string Content { get; set; }

        public int BlogId { get; set; }
        public Blog Blog { get; set; }
    }
}

三、 移植(Migrations)数据库

        如果Add-Migration出现警告而失败,就按下述过程操作。也可以,无论是否因警告而失败,都可以直接按下述操作。

//移植并新建数据库
PM> Import-Module C:\Users\YCZN_MT\.nuget\packages\microsoft.entityframeworkcore.tools\3.1.32\tools\EntityFrameworkCore.psd1
模块“EntityFrameworkCore”中的某些导入命令的名称包含未批准的动词,这些动词可能导致这些命令名不易被发现。若要查找具有未批准的动词的命令,请使用 Verbose 参数再次运行 Import-Module 命令。有关批准的动词列表,请键入 Get-Verb。
PM> Get-Verb

Verb        Group         
----        -----         
Add         Common        
Clear       Common        
Close       Common        
Copy        Common        
Enter       Common        
Exit        Common        
Find        Common        
Format      Common        
Get         Common        
Hide        Common        
Join        Common        
Lock        Common        
Move        Common        
New         Common        
Open        Common        
Optimize    Common        
Pop         Common        
Push        Common        
Redo        Common        
Remove      Common        
Rename      Common        
Reset       Common        
Resize      Common        
Search      Common        
Select      Common        
Set         Common        
Show        Common        
Skip        Common        
Split       Common        
Step        Common        
Switch      Common        
Undo        Common        
Unlock      Common        
Watch       Common        
Backup      Data          
Checkpoint  Data          
Compare     Data          
Compress    Data          
Convert     Data          
ConvertFrom Data          
ConvertTo   Data          
Dismount    Data          
Edit        Data          
Expand      Data          
Export      Data          
Group       Data          
Import      Data          
Initialize  Data          
Limit       Data          
Merge       Data          
Mount       Data          
Out         Data          
Publish     Data          
Restore     Data          
Save        Data          
Sync        Data          
Unpublish   Data          
Update      Data          
Approve     Lifecycle     
Assert      Lifecycle     
Complete    Lifecycle     
Confirm     Lifecycle     
Deny        Lifecycle     
Disable     Lifecycle     
Enable      Lifecycle     
Install     Lifecycle     
Invoke      Lifecycle     
Register    Lifecycle     
Request     Lifecycle     
Restart     Lifecycle     
Resume      Lifecycle     
Start       Lifecycle     
Stop        Lifecycle     
Submit      Lifecycle     
Suspend     Lifecycle     
Uninstall   Lifecycle     
Unregister  Lifecycle     
Wait        Lifecycle     
Debug       Diagnostic    
Measure     Diagnostic    
Ping        Diagnostic    
Repair      Diagnostic    
Resolve     Diagnostic    
Test        Diagnostic    
Trace       Diagnostic    
Connect     Communications
Disconnect  Communications
Read        Communications
Receive     Communications
Send        Communications
Write       Communications
Block       Security      
Grant       Security      
Protect     Security      
Revoke      Security      
Unblock     Security      
Unprotect   Security      
Use         Other         


PM> Add-Migration
位于命令管道位置 1 的 cmdlet Add-Migration
请为以下参数提供值:
Name: MyMigration
Unable to resolve startup project ''.
Using project '10_14' as the startup project.
Build started...
Build succeeded.
To undo this action, use Remove-Migration.
PM> Update-Database
Unable to resolve startup project ''.
Using project '10_14' as the startup project.
Build started...
Build succeeded.
Applying migration '20231115063747_MyMigration'.
Failed executing DbCommand (4ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
CREATE TABLE [Blogs] (
    [BlogId] int NOT NULL IDENTITY,
    [Url] nvarchar(max) NULL,
    CONSTRAINT [PK_Blogs] PRIMARY KEY ([BlogId])
);
Microsoft.Data.SqlClient.SqlException (0x80131904): There is already an object named 'Blogs' in the database.
   在 Microsoft.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) 位置 H:\tsaagent4\_work\2\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlConnection.cs:行号 2117
   在 Microsoft.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) 位置 H:\tsaagent4\_work\2\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParser.cs:行号 1572
   在 Microsoft.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj, Boolean& dataReady) 位置 H:\tsaagent4\_work\2\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\TdsParser.cs:行号 0
   在 Microsoft.Data.SqlClient.SqlCommand.RunExecuteNonQueryTds(String methodName, Boolean async, Int32 timeout, Boolean asyncWrite) 位置 H:\tsaagent4\_work\2\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlCommand.cs:行号 3752
   在 Microsoft.Data.SqlClient.SqlCommand.InternalExecuteNonQuery(TaskCompletionSource`1 completion, String methodName, Boolean sendToPipe, Int32 timeout, Boolean& usedCache, Boolean asyncWrite, Boolean inRetry) 位置 H:\tsaagent4\_work\2\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlCommand.cs:行号 1986
   在 Microsoft.Data.SqlClient.SqlCommand.ExecuteNonQuery() 位置 H:\tsaagent4\_work\2\s\src\Microsoft.Data.SqlClient\netfx\src\Microsoft\Data\SqlClient\SqlCommand.cs:行号 1439
   在 Microsoft.EntityFrameworkCore.Storage.RelationalCommand.ExecuteNonQuery(RelationalCommandParameterObject parameterObject)
   在 Microsoft.EntityFrameworkCore.Migrations.MigrationCommand.ExecuteNonQuery(IRelationalConnection connection, IReadOnlyDictionary`2 parameterValues)
   在 Microsoft.EntityFrameworkCore.Migrations.Internal.MigrationCommandExecutor.ExecuteNonQuery(IEnumerable`1 migrationCommands, IRelationalConnection connection)
   在 Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   在 Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   在 Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:f67e88b9-c5de-46e3-9746-9440f3bf2eee
Error Number:2714,State:6,Class:16
There is already an object named 'Blogs' in the database.
PM> 

        我的电脑中在其他项目中已经移植生成过同样的数据库,因此在数据库更新时提示并警告,忽略就好了,不影响本项目的调试和运行的。

四、编写应用程序

//.NET Framework4.8窗体应用通过EF访问新建数据库
//追加、删除数据库记录
using System;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Windows.Forms;

namespace _10_14
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        /// <summary>
        /// 初始化Form1
        /// 初始化表格,显示数据表
        /// </summary>
        private void Form1_Load(object sender, EventArgs e)
        {
            button1.Text = "追加";
            button2.Text = "删除";
            label1.Text = "追加的Url:";
            label2.Text = "删除的ID:";

            button1.Size = new Size(40, 23);
            button2.Size = new Size(40, 23);

            dataGridView1.AllowUserToAddRows = false;
            dataGridView1.AllowUserToDeleteRows = false;
            dataGridView1.AllowUserToResizeColumns = false;
            dataGridView1.AllowUserToResizeRows = false;
            dataGridView1.RowHeadersVisible = false;
            dataGridView1.AutoSizeColumnsMode=DataGridViewAutoSizeColumnsMode.AllCells;
            
            using (var db = new BloggingContext())
            {
                dataGridView1.DataSource = db.Blogs.ToList();
            }              
        }

        /// <summary>
        /// 追加Add()
        /// 无论ID是否连续,都在数据库末尾追加新纪录
        /// </summary>
        #region 追加
        private void Button1_Click(object sender, EventArgs e)
        {
            using (var db = new BloggingContext())
            {
                if (textBox1.Text != "")
                {
                    db.Blogs.Add(new Blog { Url = textBox1.Text.Trim().ToString() }); //追加记录
                    db.SaveChanges();
                    dataGridView1.DataSource = db.Blogs.ToList();
                }
                else
                {
                    db.Blogs.Add(new Blog { Url = "http://www.hao123.com/" }); //追加记录
                    db.SaveChanges();
                    dataGridView1.DataSource = db.Blogs.ToList();
                }
            }
        }
        #endregion 追加

        /// <summary>
        /// 删除Remove()
        /// </summary>
        #region 删除记录
        private void Button2_Click(object sender, EventArgs e)
        {
            using (var db = new BloggingContext())
            {               
                db.Blogs.Remove(new Blog { BlogId = Convert.ToInt32(textBox2.Text.Trim()) });               //删除记录按ID
                db.SaveChanges();
                dataGridView1.DataSource = db.Blogs.ToList();
            }
        }
        #endregion 删除记录
    }
}

五、生成效果

 

         追加:http://www.hao123.com

         追加:http://www.taobao.com

        删除ID=2的记录 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: Microsoft .NET Framework 4.8是一个由微软开发的跨平台框架和运行时环境。它是用于开发和执行基于.NET技术的应用程序的一个重要组件。.NET Framework 4.8提供了许多功能和功能,以帮助开发人员构建强大且可靠的应用程序。 首先,.NET Framework 4.8支持多种编程语言,包括C#,Visual Basic和F#等。开发人员可以根据自己的喜好和需求选择适合的语言进行开发。 其次,.NET Framework 4.8提供了大量的类库和工具,使开发人员能够快速构建应用程序。这些类库涵盖了各种功能,如网络通信,线程管理,图形处理,数据库访问等。开发人员可以利用这些类库来简化开发过程,减少编写代码的工作量。 此外,.NET Framework 4.8还具有优秀的性能和安全性。它通过即时编译和资源管理等技术提供了高效的执行性能,并具有内置的安全机制来保护应用程序免受恶意软件和攻击的影响。 对于不同架构的计算机系统,.NET Framework 4.8提供了两个版本,即x86和x64。x86是32位版本,适用于运行在32位操作系统上的计算机;x64是64位版本,适用于运行在64位操作系统上的计算机。通过提供这两个版本,.NET Framework保证了其在不同计算机系统上的兼容性和可用性。 总之,Microsoft .NET Framework 4.8是一个强大且高效的开发工具,可以帮助开发人员构建各种类型的应用程序。无论是Web应用程序,桌面应用程序还是移动应用程序,.NET Framework 4.8都能提供所需的功能和性能。 ### 回答2: Microsoft .NET Framework 4.8是由微软开发的一个软件开发平台。它提供了许多编程接口和库,用于开发和执行各种类型的应用程序,包括桌面应用程序、Web应用程序、移动应用程序和云服务。 .NET Framework 4.8支持x86和x64两种架构。x86是指处理器的32位版本,而x64是指处理器的64位版本。在选择安装.NET Framework 4.8时,根据计算机的处理器架构进行选择,以确保软件能够正确地在计算机上运行。 对于x86架构的计算机,安装.NET Framework 4.8 (x86)版本是必要的。这个版本是为32位操作系统和32位应用程序设计的。它提供了用于开发和运行32位应用程序所需的接口和库。 对于x64架构的计算机,安装.NET Framework 4.8 (x64)版本是必要的。这个版本是为64位操作系统和64位应用程序设计的。它提供了用于开发和运行64位应用程序所需的接口和库。 在安装.NET Framework 4.8时,需要根据计算机的架构选择正确的版本,以确保软件能够正常工作。如果安装了错误的版本,可能会导致应用程序无法运行或出现错误。 总之,Microsoft .NET Framework 4.8 (x86 和 x64)是用于开发和执行各种类型的应用程序的软件开发平台。选择正确的版本取决于计算机的处理器架构,以确保软件能够正确地在计算机上运行。 ### 回答3: Microsoft .NET Framework 4.8是由微软公司开发的软件框架,适用于Windows操作系统。它提供了一个统一的编程模型,用于构建和运行各种类型的应用程序,包括桌面应用程序、Web 应用程序、移动应用程序和云服务。.NET Framework 4.8提供了广泛的功能和库,以支持开发人员创建高效、可靠和安全的应用程序。 .NET Framework 4.8可分为两个版本:x86和x64。x86版本是适用于32位操作系统的,而x64版本则适用于64位操作系统。这两个版本的主要区别在于它们所适用的系统架构不同。如果您使用的是32位操作系统,您应该选择安装x86版本。如果您使用的是64位操作系统,则可以选择安装x86或x64版本,具体选择取决于您的需求。 不论您选择安装哪个版本,.NET Framework 4.8都提供了许多重要的功能和改进。它包括对异步编程模型的改进,可帮助开发人员编写更高效和响应更快的应用程序。它还提供了对新的Windows通用Windows平台应用程序 (UWP) 的支持,这意味着您可以使用.NET Framework 4.8构建在Windows操作系统各个平台上运行的应用程序。 此外,.NET Framework 4.8还提供了诸如.NET Standard 2.0和ASP.NET Core 2.0之类的重要功能和更新,以便开发人员可以更轻松地在不同的平台上构建和部署应用程序。 总而言之,Microsoft .NET Framework 4.8是一个强大且功能丰富的软件框架,为开发人员提供了构建各种类型应用程序的工具和平台。它的x86和x64版本适用于不同的操作系统架构,而且提供了许多重要的功能和改进,使开发人员能够更高效、更安全地构建应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wenchm

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值