原文鏈接:http://www.entityframeworktutorial.net/code-first/key-dataannotations-attribute-in-code-first.aspx
EF 6 Code-First系列文章目錄:
- 1 翻譯系列:什么是Code First(EF 6 Code First 系列)
- 2.翻譯系列:為EF Code-First設置開發環境(EF 6 Code-First系列)
- 3.翻譯系列:EF Code-First 示例(EF 6 Code-First系列)
- 4.翻譯系列:EF 6 Code-First默認約定(EF 6 Code-First系列)
- 5.翻譯系列:EF 6中數據庫的初始化(EF 6 Code-First 系列)
- 6.翻譯系列:EF 6 Code-First中數據庫初始化策略(EF 6 Code-First系列
- 7.翻譯系列:EF 6中的繼承策略(EF 6 Code-First 系列)
- 8.翻譯系列: EF 6中配置領域類(EF 6 Code-First 系列)
- 9.翻譯系列:EF 6以及EF Core中的數據注解特性(EF 6 Code-First系列)
- 9.1 翻譯系列:數據注解特性之----Table【EF 6 Code-First 系列】
- 9.2 翻譯系列:數據注解特性之---Column【EF 6 Code First系列】
- 9.3 翻譯系列:數據注解特性之Key【EF 6 Code-First 系列】
- 9.4 翻譯系列:EF 6以及 EF Core中的NotMapped特性(EF 6 Code-First系列)
- 9.5 翻譯系列:數據注解之ForeignKey特性【EF 6 Code-First系列】
- 9.6 翻譯系列:數據注解之Index特性【EF 6 Code-First系列】
- 9.7 翻譯系列:EF數據注解特性之--InverseProperty【EF 6 Code-First系列】
- 9.8 翻譯系列:數據注解特性之--Required 【EF 6 Code-First系列】
- 9.9 翻譯系列:數據注解特性之--MaxLength 【EF 6 Code-First系列】
- 9.10 翻譯系列:EF數據注解特性之StringLength【EF 6 Code-First系列】
- 9.11 翻譯系列:數據注解特性之--Timestamp【EF 6 Code-First系列】
- 9.12 翻譯系列:數據注解特性之ConcurrencyCheck【EF 6 Code-First系列】
- 10.翻譯系列:EF 6中的Fluent API配置【EF 6 Code-First系列】
- 10.1.翻譯系列:EF 6中的實體映射【EF 6 Code-First系列】
- 10.2.翻譯系列:使用Fluent API進行屬性映射【EF 6 Code-First】
- 11.翻譯系列:在EF 6中配置一對零或者一對一的關系【EF 6 Code-First系列】
- 12.翻譯系列:EF 6 中配置一對多的關系【EF 6 Code-First系列】
- 13.翻譯系列:Code-First方式配置多對多關系【EF 6 Code-First系列】
- 14.翻譯系列:從已經存在的數據庫中生成上下文類和實體類【EF 6 Code-First系列】
- 15.翻譯系列:EF 6中的級聯刪除【EF 6 Code-First 系列】
- 16.翻譯系列:EF 6 Code -First中使用存儲過程【EF 6 Code-First系列】
- 17.翻譯系列:將Fluent API的配置遷移到單獨的類中【EF 6 Code-First系列】
- 18.翻譯系列:EF 6 Code-First 中的Seed Data(種子數據或原始測試數據)【EF 6 Code-First系列】
- 19.翻譯系列:EF 6中定義自定義的約定【EF 6 Code-First約定】
- 20.翻譯系列:Code-First中的數據庫遷移技術【EF 6 Code-First系列】
- 20.1翻譯系列:EF 6中自動數據遷移技術【EF 6 Code-First系列】
- 20.2.翻譯系列:EF 6中基於代碼的數據庫遷移技術【EF 6 Code-First系列】
- 21.翻譯系列:Entity Framework 6 Power Tools【EF 6 Code-First系列】
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屬性的順序。