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 }
如果你还在为
支持xxx上下文的模型已在数据库创建后发生更改。请考虑使用 Code First 迁移更新数据库
找到你的数据库上下文所在的类库(一般都是写在项目中的model中,也有的独立model类库)
打开Nuget 程序包管理控制台
输入:Enable-Migrations 回车
如果正确的话 则显示已为项目 xxx启用 Code First 迁移。
我在这里说下 几种有可能出现的错误:
1No context type was found in the assembly xxx
在当前项目中 没有找到数据库上下文,也就是DbContext 继承的的 "数据库cs"
2The EntityFramework package is not installed on project xxx
当前项目已经找到了数据上下文,但是没有EntityFrameWork 需要安装输入 install-package entityframework(手大的 不知道对不对)
基本就这两个问题,如果安装成功则在项目中 出现Migrations文件夹,里面会记录每次数据迁移所发生的变化。
非常好用,不用再删除数据库 重新生成 数据丢失等问题。
常用语句 :enable-Migrations -Force 替换迁移数据文件 update-database 更新 add-migration 添加新的更新文件
求采纳为满意回答
选择开始菜单中→程序→Management SQL Server 2008→SQL Server Management Studio命令,打开SQL Server Management Studio窗口,并使用Windows或 SQL Server身份验证建立连接。
在对象资源管理器窗口中展开服务器,然后选择数据库节点
右键单击数据库节点,从d出来的快捷菜单中选择新建数据库命令。
执行上述 *** 作后,会d出新建数据库对话框。在对话框、左侧有3个选项,分别是常规、选项和文件组。完成这三个选项中的设置会后,就完成了数据库的创建工作,
在数据库名称文本框中输入要新建数据库的名称。例如,这里以“新建的数据库”。
在所有者文本框中输入新建数据库的所有者,如sa。根据数据库的使用情况,选择启用或者禁用使用全文索引复选框。
在数据库文件列表中包括两行,一行是数据库文件,而另一行是日记文件。通过单击下面的添加、删除按钮添加或删除数据库文件。
切换到选项页、在这里可以设置数据库的排序规则、恢复模式、兼容级别和其他属性。
切换到文件组页,在这里可以添加或删除文件组。
完成以上 *** 作后,单击确定按钮关闭新建数据库对话框。至此“新建的数据”数据库创建成功。新建的数据库可以再对象资源管理器窗口看到。
数据库为Oracle,就不要使用EF了。
问题已经很明显。“Make sure the provider is registered in the 'entityFramework' section of the application config file”,就是让你看看在Appconfig文件中的<provider>。
源文件中的内容如下:
<entityFramework>
<provider invariantName="SystemDataSqlClient" type="SystemDataEntitySqlServerSqlProviderServices, EntityFrameworkSqlServer" />
</entityFramework>
按理说,只要将<provider />写成:
<provider invariantName="OracleManagedDataAccessClient" type="SystemDataOracleProviderServices, EntityFrameworkOracleServer" />
之类即可,但是可悲啊!
目前支持EF6的provider有:
(1)Microsoft SQL Server provider
(2)Microsoft SQL Server Compact Edition provider
(3)Devart dotConnect Data Providers 注意
(4)Firebird provider
(5)Visual Fox Pro porvider
(6)MySQL
(7)PostgreSQL
1、2、4、5、7均可以从NuGget中获取。3、7需要到相应的网站获取。
注意第三个:这个插件就是用于Oracle数据库的,其为第三方插件,由Devart公司开发。但有两大致命缺点:1、收费(是30天免费试用,过了30天要么卸载,要么付款)。2、目前支持的Oracle的最高版本为:Oracle82i。
默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAwayBreakAwayContext。
有几种方法可以改变这种默认约定。
利用配置文件
在配置文件中新加一个连接字符串
<connectionStrings>
<add name="BreakAwayContext" providerName="SystemDataSqlClient" connectionString="Server=\SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />
</connectionStrings>
注意这里连接字符串名称和我们的context类名相同,都为BreakAwayContext。我们修改了一下默认的数据库名,将BreakAwayBreakAwayContext
改为BreakAwayConfigFile。
我们在新增一个连接字符串
<connectionStrings>
<!--<add name="BreakAwayContext" providerName="SystemDataSqlClient" connectionString="Server=\SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />-->
<add name="My_Test" providerName="SystemDataSqlClient" connectionString="Server=;Database=MyBreakAwayDb;Trusted_Connection=true" />
</connectionStrings>
新建的连接串名称和context类名不同了,所以我们要在BreakAwayContext的构造函数中指名连接串的名称:
public class BreakAwayContext : DbContext
{
public BreakAwayContext():
base("name=My_Test")
{
}
}
利用DbConnection
DbContext有一个带DbConnection重载的构造函数,说明我们也可以通过DbConnection来定位数据库位置。我们也要先修改BreakAwayContext的构造函数:
public BreakAwayContext(DbConnection connection)
: base(connection, contextOwnsConnection: false)
{ }
调用:
static void Main(string[] args)
{
try
{
var lodging = new Lodging
{
Name = "Rainy Day Motel",
};
var resort = new Resort
{
Name = "Top Notch Resort and Spa",
MilesFromNearestAirport = 30,
Activities = "Spa, Hiking, Skiing, Ballooning",
};
var cstr = @"Server=\SQLEXPRESS; Database=BreakAwayDbConnectionConstructor;Trusted_Connection=true";
using (var connection = new SqlConnection(cstr))
{
using (var context = new BreakAwayContext(connection))
{
contextLodgingsAdd(lodging);
contextSaveChanges();
}
}
}
catch (SystemDataEntityValidationDbEntityValidationException ex)
{
ConsoleWriteLine( " 保存失败");
}
ConsoleWriteLine("OK");
ConsoleRead();
}
使用连接工厂控制数据库位置
Code First的默认连接工厂是SqlConnectionFactory。此连接工厂将使用SQL Client(SystemDataSqlClient的)数据库引擎连接到数据库。默认的行为,将选择在localhost\ SQLEXPRESS创建数据库,并使用上下文类型的完全限定名作为数据库的名称。
我们可以通过指定的连接字符串段,来覆写默认规则。
static void Main(string[] args)
{
try
{
DatabaseDefaultConnectionFactory = new SqlConnectionFactory(@"Server=;Trusted_Connection=true");
using (var context = new BreakAwayContext())
{
contextDatabaseInitialize(true);
contextSaveChanges();
}
}
catch (SystemDataEntityValidationDbEntityValidationException ex)
{
ConsoleWriteLine( " 保存失败");
}
ConsoleWriteLine("OK");
ConsoleRead();
}
PS:用这个方法好像没办法指定数据库名,默认名称为context类的完全限定名。
给你举个例子:
<pre t="code" l="csharp"> static void Main(string[] args)
{
using (MyDBEntities en = new MyDBEntities())
{
var p1 = enPeopleFirst(x =>
xName == "Jim");
ConsoleWriteLine(p1Age);
var p2 = enDatabaseSqlQuery<Person>(
@"select top 1 from person
where name = 'Jim'")
First();
ConsoleWriteLine(p2Age);
//p1 p2是同一个记录
}
ConsoleReadLine();
}
以上就是关于net-EF codefirst 怎么在创建数据库时增加初始数据全部的内容,包括:net-EF codefirst 怎么在创建数据库时增加初始数据、EF中的来自数据库的EF设计器和来自数据库的CodeFirst的区别、EF的CodeFirst模型修改时,服务器上的数据库怎么更新等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)