标签归档Entity Framework

澳门新葡亰官网Entity Framework 6 +WinForm (第二首) 使用Entity Framework 进行CRUD操作 【持续优化整治中】

于第一首的功底及,本文主要讲解基于EntityFramework 及SqlServer2012
实现核心的CRUD功能。

一致、设计录入界面

开创一个录入Form,用来管理UserAccount数据。

1.每当列文件及右键,选择Add->New Item..

澳门新葡亰官网 1

2.取舍Windows 窗体 模板,将名字改成吧UserFrm.cs,点“Add”。

3.添加如下输入框

澳门新葡亰官网 2

仲、保存操作

/// <summary>
        /// 新增数据
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void Btn_Save_Click(object sender, EventArgs e)
        {
            using (OrderDBContainer db = new OrderDBContainer())
            {
                UserAccout userAccout = new UserAccout();
                userAccout.FirstName = this.FirstNameTxt.Text;
                userAccout.LastName = this.LastNameTxt.Text;
                userAccout.AuditFileds.UpdateDate = DateTime.Now;
                userAccout.AuditFileds.InsertDate = DateTime.Now;
                db.UserAccoutSet.Add(userAccout); 
                db.SaveChanges();
                MessageBox.Show("保存成功!");
            }
        }

 

二、履新数据**

EF的创新自己询问的法子产生如下三栽(可能还发其他的点子)

【代码如下】

法相同、只有FirstName的值会修改,很显要字段比较多,每个字段都遍历赋值是否修改,显示不是挺便利,故不建议采取,如果是利用框架模板另外说吧。

主意二、只有InsertDate
的值不见面为涂改,其他的字段都见面吃修改,如果字段比较多,表面上看起来较便于(只要设置不要改动的排列就推行了),测试过程中吗意识弊端,如果实体中出不可也空字段,且不再排除不保留的排列的界定外,则会招致保存失败(如下图)。

澳门新葡亰官网 3

计三,按自时的了解水平,感觉是极其负谱的,从数据库拿到数量后若拿用变更之值赋下就是足以了(从高并发、高性能方向也发出弊,因为添了数据库的支付,需要先要到数映射到实体对象,在改实体的属于性值,还要还保存到数据库,明显多矣一样浅数据库交互,而且一旦实体对象比较深,对网的出自然会增多).

仁者见仁智者见智吧

        /// <summary>
        /// 修改
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnUpdate_Click(object sender, EventArgs e)
        {
            using (OrderDBContainer db = new OrderDBContainer())
            {
                //方案一:只有Modified = true的才修改
                /*
                UserAccout userAccount = new UserAccout();
                userAccount.FirstName = this.Txt_NewFirstName.Text;
                db.UserAccoutSet.Attach(userAccount);
                db.Entry(userAccount).Property(x => x.FirstName).IsModified = true;
                */

                //方案二:只有Modified = true的才修改
                /*
                UserAccout userAccount = new UserAccout();
                userAccount.FirstName = this.Txt_NewFirstName.Text;
                userAccount.LastName = this.Txt_NewLastName.Text;
                userAccount.Id = Convert.ToInt32(CBox_User.SelectedValue);
                userAccount.AuditFileds.UpdateDate = DateTime.Now;
                userAccount.AuditFileds.InsertDate = DateTime.Now;
                db.Entry(userAccount).State = System.Data.Entity.EntityState.Modified;
                db.Entry(userAccount).Property(item =>item.AuditFileds.InsertDate).IsModified = false;
                //存在的问题复杂类型中有2个标量类型,设置其中一个标量属性的IsModified为False时,整个复杂类型中的字段都没有存储
                */

                //方案三
                int userId = Convert.ToInt32(CBox_User.SelectedValue);
                var userSet = db.UserAccoutSet.Where(p => p.Id == userId).First();
                userSet.FirstName = this.Txt_NewFirstName.Text;
                userSet.LastName = this.Txt_NewLastName.Text;
                userSet.AuditFileds.UpdateDate = DateTime.Now;
                db.SaveChanges();
                MessageBox.Show("修改完成!");
            }
        }

【遗留问题】//存在的题材错综复杂类型受到来2独标量类型,设置中一个标量属性之IsModified为False时,整个复杂类型中之字段都尚未存储

                如果发先生了解怎么解决,求指点,不胜感谢。

澳门新葡亰官网 4

三、查询数据

 

        /// <summary>
        /// 查询数据绑定dataGirdView
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnQuery_Click(object sender, EventArgs e)
        {
            using (OrderDBContainer db = new OrderDBContainer())
            {
                List<UserAccout> list = db.UserAccoutSet.Where(x =>x.FirstName == "zhou").ToList();
                dataGridView1.DataSource = list;
            }     
        }

 

季、删除数据

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void BtnDelete_Click(object sender, EventArgs e)
        {
            using (OrderDBContainer db = new OrderDBContainer())
            {
                //方式一、按员工的ID删除
                int userId = Convert.ToInt32(CBox_User.SelectedValue);
                UserAccout userSet = new UserAccout() { Id = userId };
                db.Entry(userSet).State = System.Data.Entity.EntityState.Deleted;
                db.SaveChanges();
                MessageBox.Show("删除完成!");
            }
        }

链接: https://pan.baidu.com/s/1i5cRdy9 密码: z63m

打赏支付宝:

澳门新葡亰官网 5

EF Code-First(Oracle)通过Migration来更新数据库的表底字段

关于Oracle中以Entity Framework 6.x
Code-First方式开发,请参见博客(菩提下的杨过)https://www.cnblogs.com/yjmyzz/p/how-to-use-code-first-in-oracle-with-entity-framework-6.html的具体介绍,里面关于用Entity
Framework进行Code-First开发暨开创Database
Migration有详尽的上书与官方参考的连天。这里就是非赘述了。

运用EntityframeWork的CodeFirst来写序的时光,会不时遇上需要改实体内容(即表中的字段的始末),这个时候即便需要用到Database
Migration,但是当实际上过程被难免会遇见有题目,这里记录几只自碰到的题材,以及缓解之方。

1、关于创建与以Migration,本文中连连参考的文章曾生矣,这里总结一下几个使用命令。

工具(Tools)–>程序包管理器(Package
Manager)–>程序包管理器控制台(Package Manager
Console),1)Enable-Migrations;2)Add-Migration
MigrationName;3)Update-Migration(这里仿佛之前写错了,应该是:Update-Database)。

2、Update-Migration(这里仿佛之前写错了,应该是:Update-Database)出错。

Update-Migration(这里仿佛之前写错了,应该是:Update-Database)有时候会出错,出错的缘由发生很多,原因恐怕是部署问题,可能是数据库原因,以及另外原因,这个时候如果以找不顶解决之不二法门,这个时刻更转实体对应之表或者实体性对应之表底字段,是无奈的相同种下策。比如我以事实上付出被相遇将没有增长[Attribute]的string类型属性添加[MaxLength]Attribute之后,生成Migration,怎么都属不了Update-Migration。无奈只好先去旧的性,再续加上去。就可了。

3、Add-Migration出错。

Add-Migration出错一般容易报错的凡“Unable to generate an explicit
migration because the following explicit migrations are
pending:[MigrationName].Apply the pending explicit migrations before
attenpting to generate a new explicit
migration”。这个似是而非是以前面有一个新建(New Add-Migration
Command)的Migration没有受执行(Update-Migration),处于听命(pending)的状态,只要先运行命令将这个migration执行了就算排除pending状态了。一般都是由update-migration执行不了才见面促成后面的add-migration无法持续。这里可以预先拿前的Migration里面的“public
override void
up()”方法中的代码注释了在实行Update-Migration命令,这样非会见对数据库来实际操作,也解除了pending状态。然后便可上加新的Migration了。

外加澳门新葡亰官网(修改时间:2017年12月19日09:56)

行使AutomaticMigrationsEnabled =
true(将Migrations文件夹下的Configurations.cs里面的装置改下就足以了)
 这样之后更新数据库的时刻偏偏需要输入Update-Database就好了,不用Add-Migration了。

 

 

澳门新葡亰官网当.NET Core类库中使EF Core迁移数据库及SQL Server

前言

要是大家刚刚使用EntityFramework
Core作为ORM框架的话,想必都见面遇见数据库迁移的一部分题目。

胚胎我是当ASP.NET
Core的Web项目蒙进行的,但新兴察觉在这里并无是大客观,一些有关数据库的迁移,比如新增表,字段,修改字段类型等等,不应当跟极其上层的Web项目所关联,数据的迁文件放到这里吧觉得有些多余,有硌乱乱之感觉到,所以才想在单身出来由特别的型进展管理会比较好,也较清楚!

注意目标框架选择的是.NET Core 2.0假设不是.NET
Standard 2.0。

0、前期准备

a)、表实体定义,这个是在.NET
Standard 2.0底类库中存放的。

    /// <summary>
    /// 系统应用的用户实体
    /// </summary>
    public class ApplicationUser : BaseModel
    {
        /// <summary>
        /// 用户名
        /// </summary>
        public string UserName { get; set; }

        /// <summary>
        /// 密码
        /// </summary>
        public string Password { get; set; }

        /// <summary>
        /// 邮件地址
        /// </summary>
        public string Email { get; set; }
    }

b)、新建一个.NET Core
2.0底类库,并定义好我们所假设使用的数据库上下文,很简短,接下开始我们的正文

    /// <summary>
    /// 系统上下文
    /// </summary>
    public class LightContext : DbContext
    {
        public LightContext(DbContextOptions<LightContext> options) : base(options)
        {
        }

        /// <summary>
        /// 系统应用用户
        /// </summary>
        public DbSet<ApplicationUser> ApplicationUser { get; set; }

        /// <summary>
        /// 角色表
        /// </summary>
        public DbSet<Role> Role { get; set; }
    }

1、问题集中

首先使保证仓储类库中就引入以下简单独Nuget包,没有的说话请以包管理器进行设置。不建议直接引入原包:Microsoft.AspNetCore.All,按需引入即可

Install-Package Microsoft.EntityFrameworkCore.SqlServer

Install-Package Microsoft.EntityFrameworkCore.Tools

a)打开CMD,然后切换到类库所在路径下,执行以下命令。不过你呢得以利用程序包管理器控制台(PMC)进行搬迁,但是会生有限变化,部分令见下表:

迁移命令描述 CMD命令 PMC命令
创建迁移:migrationname为迁移名称 dotnet ef migrations add migrationname add-migration migrationname
移除迁移(删除最近的一次迁移) dotnet ef migrations remove remove-migration
应用最新的迁移(使迁移文件应用到数据库) dotnet ef database update update-database
应用指定的迁移 dotnet ef database update migrationname update-database migrationname
查看迁移列表 dotnet ef migrations list  
查看数据库上下文信息 dotnet ef dbcontext info  
dotnet ef

澳门新葡亰官网 1

荒谬提示:

  未找到与命令“dotnet-ef”匹配的可执行文件

釜底抽薪方式:

  于档次文件Light.Repository.csproj中上加以下节点

<ItemGroup>
    <DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="2.0.1" />
</ItemGroup>

又履行方的吩咐,如果出现了EF
Core的表明(一头蓄势待发的野马)表示已打响

澳门新葡亰官网 2

 b)、执行以下命令进行搬迁

dotnet ef migrations add InitLightDB

澳门新葡亰官网 3

左提示:

The specified framework version ‘2.0’ could
not be parsed
The specified framework
‘Microsoft.NETCore.App’, version ‘2.0’ was not found.

  • Check application dependencies and
    target a framework version installed at:
    \
  • Alternatively, install the framework
    version ‘2.0’.

缓解方式:

  以品种文件中上加以下节点:

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <RuntimeFrameworkVersion>2.0.3</RuntimeFrameworkVersion>
  </PropertyGroup>

c)、重新履行b步骤的一声令下,报错信息如下:

澳门新葡亰官网 4

错提示:

  Unable to create an object of type
‘LightContext’. Add an implementation of
‘IDesignTimeDbContextFactory<LightContext>’ to the project, or see
https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns
supported at design time.

是题目而是在Web项目,并且安排了DbContext的链接字符串的话,是未见面油然而生这问题之。很强烈是迁移命令没有找到DbConnectionString导致的,接下去我们按照提示,实现一个IDesignTimeDbContextFactory<LightContext>试试

解决办法:

  创建一个暨DbContext同一目录下之DesignTimeDbContextFactory文件,然后实现接口中的计CreateDbContext,并布置ConnectionString

   public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>
    {
        public LightContext CreateDbContext(string[] args)
        {
            var builder = new DbContextOptionsBuilder<LightContext>();
            builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");
            return new LightContext(builder.Options);
        }
    }

 再次实施迁移命令,终于成功了。

澳门新葡亰官网 5

遂唤醒:

  Done. To undo this action, use ‘ef
migrations remove’

而且类库下面会生成Migrations文件夹和相关的搬文件

澳门新葡亰官网 6

2、小试迁移命令

a)、使用以下命令下迁移,生成数据库与发明

dotnet ef database update

澳门新葡亰官网 7

通过VS的SQL
Server资源管理器查看转数据库的结构,其中__EFMigrationsHistory也每次迁移的记录表

澳门新葡亰官网 8

b)、因为string类型的字段迁移至数据库后的数据类型为nvarchar(max)并且是不过空类型的,下面我们尽管采取Fluent
API对ApplicationUser表字段进行部署,同样你呢得以应用性能注解的办法展开布置,因为自要好未希罕“污染”表实体

    public static void ConfigApplicationUser(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<ApplicationUser>(m =>
            {
                m.Property(t => t.Email)
                        .HasMaxLength(50);

                m.Property(t => t.UserName)
                        .IsRequired()
                        .HasMaxLength(50);

                m.Property(t => t.Password)
                        .IsRequired()
                        .HasMaxLength(20);
            });
        }

然后同应用方面的一定量长达命令还搬并创新数据库结构

澳门新葡亰官网 9

考察数库表结构已更新

澳门新葡亰官网 10

 同理添加字段,删除字段都是平等的动迁操作,还是生有益于的

3、扩展

a)、为了方便演示,其实上面在类库中尽迁移时的数据库连接字符串是摹写死的,那么极端好的法门是应该去念取Web项目下就配备好的连续,这样就是可知管上下的一致性,不用再错过为EF的迁徙而独自维护一个余下的数据库连接配置。改造也颇简单,即由此Configuration组件读取appsettings.json的ConnectionStrings节点,改造后是这样子的:

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<LightContext>
    {
        public LightContext CreateDbContext(string[] args)
        {
            Directory.SetCurrentDirectory("..");//设置当前路径为当前解决方案的路径
            string appSettingBasePath = Directory.GetCurrentDirectory() + "/Light.AuthorityApi";//改成你的appsettings.json所在的项目名称
            var configBuilder = new ConfigurationBuilder()
                .SetBasePath(appSettingBasePath)
                .AddJsonFile("appsettings.json")
                .Build();

            var builder = new DbContextOptionsBuilder<LightContext>();
            //builder.UseSqlServer("Server=(localdb)\\MSSQLLocalDB;Integrated Security=true;Initial Catalog=Light;");
            builder.UseSqlServer(configBuilder.GetConnectionString("LightConnection"));
            return new LightContext(builder.Options);
        }
    }

小心用分外引入下面这Nuget包:

Install-Package Microsoft.Extensions.Configuration.Json

b)、属性注解[Column(Order = 1)]本着EF
Core来说还从未直达可以调动数据库生成字段的次第,不过我们要得修改迁移文件的实业性之相继来齐我们怀念如果的效应。下面是自我调之后再次转的申,是休是看下与方的出啊两样,一贪图胜万语:

澳门新葡亰官网 11

 c)、最后一步,自己动手试试看:创建一个SeedData迁移文件来补偿加数据库的起来数据。:)

4、最后

EF
Core的强大远不止这些,还有再多之运方法等正在我们去发现,去探讨。每天进步一点点,是起非常欢喜的事务!

澳门新葡亰官网有关VS2017,VS2015 中动用 EF使用Mysql 不示数据源问题解决方案

 

每当win7,win10,vs2015,vs2017里折腾了一定量上,死活就是调动不出去Mysql数据源。真是生活见不善了。

直接说方案吧。

如出一辙,卸载你所装了之mysql-connector-net、mysql-for-visualstudio-1.2.7、mysql-installer-community、mysql-installer-web-community等以落实连续的运或叫,在控制面板,卸载程序里查抄,搜到这个右键卸载。清理,重开,关掉VS。

仲,确认ODBC驱动,在控制面板\拥有控制面板项\管理工具
中查ODBC数据源64各项。

澳门新葡亰官网 1

承认图被少使得是否有。假如不有,去官方下载:https://dev.mysql.com/downloads/connector/odbc/
安装,完成后,重新打开 ODBC数据源,确认驱动情况,最好又开。

老三、安装 mysql-for-visualstudio-1.2.7.msi 这个起只问题,如果您是下载的
mysql-installer-web-community-5.7.20.0.msi
(内富含mysql-for-visualstudio)你晤面神奇之意识,它恐怕不识别VS2015同VS2017造成mysql-for-visualstudio选不了,而设置不了。所以只要独立安装mysql-for-visualstudio-1.2.7.msi,安装包和谐查找吧。我也是上下一心寻找的,实在找不至。再联系我吧。安装完毕之后,澳门新葡亰官网最好重开。(mysql-for-visualstudio-2.0.4貌似无法正常办事)

季、安装mysql-connector-net,笔者下载了mysql-connector-net-6.10.5.msi
屡品尝无果,怀疑是版及1.2.7来兼容问题。后透过mysql-installer-web-community-5.7.20.0.msi
里面的模块安装了mysql-connector-net-6.9.9。安装成功后,最好再开,然后打开VS,神奇的意识,真的好了。唉,这同样龙天煎熬的。

澳门新葡亰官网 2

倘,你看这篇文章帮助了您,请留言激励。

 

网站地图xml地图