
1 使用CodeFirst方式创建数据库
我们新建一个控制台项目,项目中添加两个Model:Author和Blog以及DbContext。 DbContext的添加方式如下:
项目上右键->添加->新建项->ADONET Entity Data Model->Empty Code First model
项目代码如下:
1 //默认生成的数据表名为类名+字母s,这里使用TableAttribute来指定数据表名为T_Authors
2 [Table("T_Authors")]
3 public class Author
4 {
5 public int Id { set; get; }
6 public string Name { set; get; }
7 /
8 此处定义了Blog类型的属性,所以要确保Blog类中至少要有一个表示主键的字段,即public int Id { set; get; }。
否则在生成数据表时会报错:"EntityType 'Blog' has no key defined Define the key for this EntityType
9 Blogs: EntityType: EntitySet 'Blogs' is based on type 'Blog' that has no keys defined"
10 /
11 public virtual ICollection<Blog> Blogs { set; get; }
12 }
13
14 [Table("T_Blogs")]
15 public class Blog
16 {
17 public int Id { set; get; }
18 public string Title { set; get; }
19 public DateTime Time { set; get; }
20 public int AuthorId { set; get; }
21 public virtual Author Author { set; get; }
22 }
23
24 public class MyDbContext: DbContext
25 {
26 public MyDbContext()
27 : base("name=MyDbContext")
28 {
29 }
30 //DbContext会根据配置文件中connectionStrings指定的数据库名称来建立数据库
31 //DbContext根据DbSet属性的类型来创建数据表,这里指定了Author类型的属性,所以会生成T_Authors数据表
32 public virtual DbSet<Author> Authors { set; get; }
33 }
CodeFirst方式会根据配置文件中的配置生成数据库,这里小编使用的是MYSQL数据库,配置文件如下:
1 <!--EF for MYSQL-->
2<entityFramework codeConfigurationType="MySqlDataEntityMySqlEFConfiguration, MySqlDataEntityEF6">
3 <defaultConnectionFactory type="SystemDataEntityInfrastructureSqlConnectionFactory, EntityFramework" />
4 <providers>
5 <provider invariantName="MySqlDataMySqlClient" type="MySqlDataMySqlClientMySqlProviderServices, MySqlDataEntityEF6" />
6 </providers>
7 </entityFramework>
8 <connectionStrings>
9 <add name="MyDbContext" connectionString="server=localhost;port=3306;database=EF;uid=root;password=root" providerName="SystemDataMySqlClient" />
10 </connectionStrings>
PS:小编使用的是EF6和MYSQL数据库,所以要在项目中添加对MysqlDataEntityEF6以及EntityFrameword 60的引用。
到此,我们已经完成生成数据库的工作,接下来在Main方法中写两行代码:
1 using (var db = new ManagerDb())
2 {
3 dbAuthorsAdd(new Author() { Name = "xfh" });
4 dbSaveChanges();
5 }
ef的codefirst是个好东西,让我们完全不用考虑数据库端(注意,这里并不是说不需要对数据库知识进行了解),一切工作都可以通过代码来完成。ef是orm,已经把数据访问 *** 作封装得很好了,可以直接在业务层中使用,那我们为什么还要对其进行那么多封装呢?在我看来,封装至少能带来如下的好处:
把ef的相关对象封装在数据访问层中,解除了业务层对ef的依赖。
统一ef的数据 *** 作,以保证业务层使用相同的代码规范
隐藏ef的敏感配置,降低ef的使用难度
这里就引入一个问题,应该怎样来进行ef的封装呢,既要保证使用的统一与方便性,又要保持ef的灵便性,否则,封装将变成给业务层设置障碍。下面,主要针对数据查询进对可能出现的误用情况进行分析。
肯定能保住的。 我们是这样的做的,先在表里添上字段,然后用 EF Power Tools 根据数据库生成对应的poco类。这样 就不会重新生成数据库了。 用 codefirst 据我所知 都是用ef power tools 来生成poco类的。因为一般开发人员都是习惯于先设计数据库。希望我的回答能给你带来帮助。
EF Code-Frist本身就是支持事务的。
我们的每一次SaveChanges就是一个事务 *** 作,只需要在所有更改都完成后,调用这个方法就可以了。
如果你不愿意,网上还有人给出了手动的开启事务的代码(我没有测试过):
DbConnection con = ((IObjectContextAdapter)ctx)ObjectContextConnection;
conOpen();
using (var tran = conBeginTransaction())
{
// 这里才是事务中的代码
tranCommit();
}
conClose();
以上都是针对一个DbContext,也就是一个数据库的时候,如果 *** 作涉及到多个数据库,还是使用分布式事务 *** 作比较靠谱。
原文链接:>
这里我们选择 ASPNET Core Web Application (NET Core)
这里选择web 应用程序,然后更改身份验证 改为 不进行身份验证
然后再包管理控制台里执行下面两条命令
引用 EntityFrameworkCore
Install-Package MicrosoftEntityFrameworkCore
再引用 EntityFrameworkCoreSqlServer
Install-Package MicrosoftEntityFrameworkCoreSqlServer
创建实体
我们在项目添加一个 Models 文件夹。
新建一个Usercs
public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
}
这里我为了方便,继续新建 DataContextcs
public class DataContext : DbContext
{
public DataContext(DbContextOptions<DataContext> options)
: base(options)
{
}
public DbSet<User> Users { get; set; }
}
创建数据库
打开 Startupcs 在 ConfigureServices 下添加如下代码:
public void ConfigureServices(IServiceCollection services)
{
//这里就是填写数据库的链接字符串
var connection = "Data Source=;Initial Catalog=EFCore;User ID=sa;Password=sa123";
servicesAddDbContext<DataContext>(options => optionsUseSqlite(connection));
// Add framework services
servicesAddMvc();
}
你好:
EF可以支持多数据库的,比如sql server, mysql , oracle,它可以做到迁移数据库,可以几乎不改代码,但是,edmx其实是一个配置文件,也包含了目标数据库的信息。
如果要做到更改配置就可以切换数据库,那么,有以下几点:
1:3种数据库的provider的文档要仔细看,确认哪些功能是不被支持的,取支持功能的最小集,写进开发规范,规定哪些linq语句不允许写。
2:为3种数据库准备3套edmx,这样比较简单,也可以把ssld之类生成在dll之外,然后动态修改,但容易出错且麻烦。不论是dbfirset还是codefirst,根据目标数据库类型重新生成edmx都比较简单。
3:更改连接串,EF的连接串中,需要指定传统连接串/EF的provider/相应的edmx配置(ssld,csdl,msl),把这3个要素都根据1,2配置为你的目标数据库对应的配置之后,理论上,你的代码就可以直接运行。
先分别介绍一下三种方法的联系:
1Database First是基于已存在的数据库,利用某些工具(如VS提供的EF设计器)创建实体类,数据库对象与实体类的匹配关系等,你也可以手动修改这些自动生成的代码及匹配文件。也就是从一个数据库开始,然后生成实体框架和相应代码。
2Model First 是先利用某些工具(如VS的EF设计器)设计出可视化的实体数据模型及他们之间的关系,然后再根据这些实体、关系去生成数据库对象及相关代码文件。
3Code First 这种方式需要先写一些代码,如实体对象,数据关系等,然后根据已有的代码描述,自动创建数据对象。但其实这种方法与Model First是非常类似的。我们自己写的代码,其实就是用代码表示实体模型,而Model First是用可视化的方式描述了实体模型。
下面分析这三种方式的优缺点:
Database-First模式明显性能会差点,但是它很适合初学者,或者是比较急的小型项目。还有一点,我们在做项目时可能不容易体会到它的好处,但如果做数据库结构比较成熟稳定的产品时,我们可以很轻松的使用数据库生成实体模型,从而实现快速开发。
Model-First模式优点是开发人员能够在模型设计完成后,可以利用VS等工具快速生成数据库脚本。缺点是设计模型时完全了解数据库的结构,在模型中手动添加表关系,并且生成的脚本有点不简洁。
Code-First模式优点是性能比较好,且代码较少冗余。不过它的缺点也有很多,由于都是代码编写的,比如更新数据库。
这三种方式各有利弊,使用过程中我们要按实际需求来选择。这些工具的出现和使用,大大提高了开发人员的开发速度,使得数据库、模型等出现了复用、扩展的可能,在应对变化方面也做了足够的工作。这些工具所体现的服务思想更提醒我们要全方位去考虑问题,在产品中做好应对变化的措施。
以上就是关于net-EF codefirst 怎么在创建数据库时增加初始数据全部的内容,包括:net-EF codefirst 怎么在创建数据库时增加初始数据、ef code first 怎样指定哪些类生成数据表那些不生成数据表、MVC3 codefirst 与 Databasefirst等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)