net-EF codefirst 怎么在创建数据库时增加初始数据

net-EF codefirst 怎么在创建数据库时增加初始数据,第1张

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模型修改时,服务器上的数据库怎么更新等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9332572.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存