原文連接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspxhtml
EF 6 Code-First系列文章目錄:數據庫
Key特性應用於實體的一個屬性上面,使之成爲鍵屬性,而後生成數據庫的時候,數據表中相應的列就會成爲主鍵。默認的約束爲名稱爲ID或者實體名稱+ID的屬性,建立主鍵。Key特性重寫了默認的約定。app
正如上面的代碼所示,咱們在Student實體的StudentKey屬性上面,應用於Key特性,這樣就會重寫默認的約定,就會在Students表的StudentKey列上,建立一個主鍵:ide
Key特性能夠應用於任何原始數據類型的屬性上,除了無符號整形。學習
EF 6中:測試
在EF 6中 ,Key特性能夠應用於實體的多個屬性上面,而後就能夠在數據庫中,建立聯合主鍵。ui
EF Core不支持使用數據註解的Key特性,來建立聯合主鍵,在EFCore中你必須使用Fluent API中的HasKey方法,來建立聯合主鍵。spa
上面的代碼,將會在Students表中建立聯合主鍵【StudentKey和AdmissionNum】:.net
注意的是: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屬性的順序。