A. django使用已有的資料庫表怎麼建立model
在網上看到都是使用Django的models和makemigration,migrate命令來創建新表,並使用。可是我的數據已經存在了已經創建好,並且已經存儲有數據了,不能再重新創建新表了。了解Django的表明和models名稱的映射關系就可以讓Django使用已經存在的表。
假如在Django存在models如下:
[python]view plain
fromdjango.dbimportmodels
#Createyourmodelshere.
classSciencenews(models.Model):
id=models.CharField(max_length=36,primary_key=True)
first_mole=models.CharField(max_length=30,default="News")
second_mole=models.CharField(max_length=30,default="LatestNews")
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
pythonmanage.pymakemigration
pythonmanage.pymigrate
我的存儲爬取到的數據的表格名稱原來為science_news,想要Django使用它,而不是創建新的表,只需要把的它的名稱改為:應用名_要與該表映射的models名稱,在此處我改為show_sciencenews。然後使用如上的數據遷移命令,這時可能會提示數據表已經存在的錯誤,不用理會,models已經和數據表映射上了。接下來只需要正常使用models和數據表就可以了。
B. 如何從資料庫生成 EF Code First model
默認情況下,資料庫是創建在localhost\SQLEXPRESS伺服器上,並且默認的資料庫名為命名空間+context類名,例如我們前面的BreakAway.BreakAwayContext。
有幾種方法可以改變這種默認約定。
利用配置文件
在配置文件中新加一個連接字元串
<connectionStrings>
<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />
</connectionStrings>
注意這里連接字元串名稱和我們的context類名相同,都為BreakAwayContext。我們修改了一下默認的資料庫名,將BreakAway.BreakAwayContext
改為BreakAwayConfigFile。
我們在新增一個連接字元串
<connectionStrings>
<!--<add name="BreakAwayContext" providerName="System.Data.SqlClient" connectionString="Server=.\SQLEXPRESS;Database=BreakAwayConfigFile;Trusted_Connection=true" />-->
<add name="My_Test" providerName="System.Data.SqlClient" 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=;Trusted_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類的完全限定名。
C. 如何從資料庫生成 EF Code First model
http://msdn.microsoft.com/en-us/gg558520
這句話很好的解釋了EDM是個啥玩意。
At
its core, the ADO.NET Entity Framework relies on an Entity Data Model.
An EDM provides all the metadata the framework needs to translate LINQ
queries into
SQL commands
and materialize objects from query results. This metadata includes a
storage model (which describes a database schema), a conceptual model
(which describes entities used in the application), and the mapping between the storage and conceptual models.
1.用T4模版生成POCO Entiteshttp://blogs.msdn.com/b/adonet/archive/2010/01/25/walkthrough-poco-template-for-the-entity-framework.aspx
2.codefirst是先代碼後生成資料庫的,此文介紹了如何從資料庫生成codefirst models http://weblogs.asp.net/jgalloway/archive/2011/02/24/generating-ef-code-first-model-classes-from-an-existing-database.aspx 一下部分是原文過來的。
D. 我做開發時,習慣資料庫中每個表對應一個model類,裡面封裝各種操作,這樣做好嗎
建議你學一下hibernate
像你說的這樣估計是有多表之間的關聯,如表之間存在1對1、1對多、多對專1的關系,這時是屬用hibernate可是將所有的表封裝,在你從資料庫差出某條數據時,hibernate可以幫你查處和這條數據相關的其他表中的數據,這樣可以封裝你可能用到的所有的類,進而,表面上你只查了一次,其實hibernate幫你把潛在需要的數據也封裝了。
例如:
表A對應著類A,表B對應著類B。表A和表B之間是一對多的關系。
類A和類B將有如下關系:
class A{
Set bs = new HashSet();
A的其它屬性和方法
}
class B{
A a;
B的其它屬性和方法
}