如何从数据库生成 EF Code First model

如何从数据库生成 EF Code First model,第1张

默认情况下,数据库是创建在localhost\SQLEXPRESS服务器上,并且默认的数据库名为命名空间+context类名,例如我们前面的BreakAway.BreakAwayContext。

有几种方法可以改变这种默认约定。

利用配置文件

在配置文件中新加一个连接字符串

<connectionStrings>

<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESSDatabase=BreakAwayConfigFileTrusted_Connection=true" />

</connectionStrings>

注意这里连接字符串名称和我们的context类名相同,都为BreakAwayContext。我们修改了一下默认的数据库名,将BreakAway.BreakAwayContext

改为BreakAwayConfigFile。

我们在新增一个连接字符串

<connectionStrings>

<!--<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESSDatabase=BreakAwayConfigFileTrusted_Connection=true" />-->

<add name="My_Test" providerName="System.Data.SqlClient" connectionString="Server=.Database=MyBreakAwayDbTrusted_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=.\SQLEXPRESSDatabase=BreakAwayDbConnectionConstructorTrusted_Connection=true"

using (var connection = new SqlConnection(cstr))

{

using (var context = new BreakAwayContext(connection))

{

context.Lodgings.Add(lodging)

context.SaveChanges()

}

}

}

catch (System.Data.Entity.Validation.DbEntityValidationException ex)

{

Console.WriteLine( " 保存失败")

}

Console.WriteLine("OK")

Console.Read()

}

使用连接工厂控制数据库位置

Code First的默认连接工厂是SqlConnectionFactory。此连接工厂将使用SQL Client(System.Data.SqlClient的)数据库引擎连接到数据库。默认的行为,将选择在localhost\ SQLEXPRESS创建数据库,并使用上下文类型的完全限定名作为数据库的名称。

我们可以通过指定的连接字符串段,来覆写默认规则。

static void Main(string[] args)

{

try

{

Database.DefaultConnectionFactory = new SqlConnectionFactory(@"Server=.Trusted_Connection=true")

using (var context = new BreakAwayContext())

{

context.Database.Initialize(true)

context.SaveChanges()

}

}

catch (System.Data.Entity.Validation.DbEntityValidationException ex)

{

Console.WriteLine( " 保存失败")

}

Console.WriteLine("OK")

Console.Read()

}

PS:用这个方法好像没办法指定数据库名,默认名称为context类的完全限定名。

在网上看到都是使用Django的models和makemigration,migrate命令来创建新表,并使用。可是我的数据已经存在了已经创建好,并且已经存储有数据了,不能再重新创建新表了。了解Django的表明和models名称的映射关系就可以让Django使用已经存在的表。

假如在Django存在models如下:

[python] view plain copy

from django.db import models

# Create your models here.

class Sciencenews(models.Model):

id = models.CharField(max_length=36,primary_key=True)

first_module = models.CharField(max_length=30,default="News")

second_module = models.CharField(max_length=30,default="Latest News")

title = models.CharField(max_length=300)

author = models.CharField(max_length=60,null=True)

publish_date = models.CharField(max_length=35,null=True)

content = models.TextField(null=True)

crawl_date = models.CharField(max_length=35,null=True)

from_url = models.CharField(max_length=350,null=True)

执行数据迁移命令:

[python] view plain copy

python manage.py makemigration

python manage.py migrate

会在数据库中生成名称为show_sciencenews的数据表。show为应用名称,此处我的应用名称为show。可以看到Django创建表的命名规则:应用名_模型名。

我的存储爬取到的数据的表格名称原来为science_news,想要Django使用它,而不是创建新的表,只需要把的它的名称改为:应用名_要与该表映射的models名称,在此处我改为show_sciencenews。然后使用如上的数据迁移命令,这时可能会提示数据表已经存在的错误,不用理会,models已经和数据表映射上了。接下来只需要正常使用models和数据表就可以了。

在数据库上 右键-在数据库创建数据库架构HTML...。 选择你要表,再点击创建。就会生成一个html格式的数据字典。 需要excel或者word,那就只能自己手动创建excel,word文件, 然后复制整个表格,贴上去。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存