原文鏈接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspx Key特性應用於實體的一個屬性上面,使之成為鍵屬性,然後生成資料庫的時候,數據表中相應的列就 ...
原文鏈接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspx
Key特性應用於實體的一個屬性上面,使之成為鍵屬性,然後生成資料庫的時候,數據表中相應的列就會成為主鍵。預設的約束為名稱為ID或者實體名稱+ID的屬性,創建主鍵。Key特性重寫了預設的約定。
正如上面的代碼所示,我們在Student實體的StudentKey屬性上面,應用於Key特性,這樣就會重寫預設的約定,就會在Students表的StudentKey列上,創建一個主鍵:
Key特性可以應用於任何原始數據類型的屬性上,除了無符號整形。
EF 6中:
在EF 6中 ,Key特性可以應用於實體的多個屬性上面,然後就可以在資料庫中,創建聯合主鍵。
EF Core不支持使用數據註解的Key特性,來創建聯合主鍵,在EFCore中你必須使用Fluent API中的HasKey方法,來創建聯合主鍵。
上面的代碼,將會在Students表中創建聯合主鍵【StudentKey和AdmissionNum】:
註意的是:Key特性,標識一個列生成的單一主鍵是自增主鍵,而複合主鍵不會生成自增列。
學習不動手,那就是耍流氓,無用功,我們自己動手試試:
1.創建一個名稱為EFAnnotationKey的控制台應用程式,安裝好EF
2.創建一個Student類:
public class Student
{
public int StudentID { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Sex { get; set; }
}
3.創建一個上下文類:
public class EFDbContext:DbContext
{
public EFDbContext() : base("name=Constr")
{
}
public DbSet<Student> Students { get; set; }
}
4.App.config配置文件:【資料庫連接字元串】
<!--資料庫連接字元串-->
<connectionStrings>
<add name="Constr" connectionString="Server=.;Database=EFAnnotationKeyDB;uid=sa;pwd=Password_1" providerName="System.Data.SqlClient"/>
</connectionStrings>
5.測試代碼:
class Program
{
static void Main(string[] args)
{
using (var db = new EFDbContext())
{
List<Student> lstStuModel = db.Students.ToList();
}
Console.WriteLine("success");
Console.ReadKey();
}
}
6.運行代碼:
看看生成的資料庫:可以看到
1.預設生成的數據表名稱為Students,
2.預設的模式名為dbo,
3.預設將StudentID屬性映射為主鍵,並且主鍵預設是自增的。
4.字元串類型預設生成nvarchar(max),int類型預設生成not null的列
1.我們使用Key 特性來重寫一下預設的約定,修改Student實體:
2.修改上下文類:
3.運行程式:
看看生成的資料庫:【可以看到,生成一個StudentNumber主鍵列,並且是自增的】
現在看看複合主鍵列:【可以看到我們沒有使用Column指定兩個屬性的順序,先看看可以生成複合主鍵列不。】
運行程式:報錯了,可以看到,我們沒有指定兩個屬性的先後順序是不行的。
修改一下Student類:這裡我們沒有按照索引的順序指定,運行看下:
成功了,我們看下資料庫是啥樣的:
可以看到:
1.即使沒有按照索引屬性指定複合主鍵的順序,依然能生成資料庫以及表,順序是,優先按照指定的列的順序,其他沒有指定的屬性順序,是按照他們在實體中的先後順序,在資料庫中排列的。
2.生成的複合主鍵,都不是自增的。
再來看下這樣的情況,只對一個屬性列,設置順序,看看:
運行:
可以看到還是不行,必須同時指定列的順序。
綜上所述,我們可以總結如下【EF 數據註解Key特性】:
1.EF預設生成的主鍵是ID屬性列,或者名稱為實體名+ID的的屬性列,可以通過Key特性重寫。
2.生成單一主鍵列的時候,是自增的,而生成複合主鍵,都不是自增的
3.EF 生成複合主鍵,必須同時設置Key特性以及使用Column特性中的Order參數指定所有標誌KEY屬性的順序。