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 属性的顺序.
来源: https://www.cnblogs.com/caofangsheng/p/10657415.html