SQL语句、EF DataAnnotation和EF Fluent API方式创建联合主键
SQL语句,先创建一张没有主键的表
create table tb_test1 ( id1 int not null, id2 int not null, [name] nvarchar(10) )
-- 传入的两列不能是主键,不然报错,说该表已经存在主键 alter table tb_test1 add constraint pk_id2 primary key(id1,id2)
DataAnnotations
public class Student3 { [Key,Column(Order =1)] public int Id1 { get; set; } [Key,Column(Order = 2)] public int Id2 { get; set; } public string Name { get; set; } }
Fluent API
public class Student4 { public int Id1 { get; set; } public int Id2 { get; set; } public string Name { get; set; } }
在EF上下文的OnModelCreting方法中配置
modelBuilder.Entity<Student4>().ToTable("tb_Students4") .HasKey(x => new { x.Id1, x.Id2 });
DataAnnotaion的方式必须要加Column.Order,不然就会报下面这个错误。但是Fluent API方式根本就不需要配置ColumnOrder也可以。
那这个ColumnOrder到底是什么意思。其实就是指定列的顺序,比如Id1属性的ColumnOrder为9,Name属性的ColumnOrder属性为1,那么最后生成的表结构就是,Name列在Id1列的左边,Name列先于Id1列创建。
这个还是不错的吧,我以前也碰到过这样的情况,就是我用SQL语句给某张表添加了一列,默认是在最后面。怎么让这个列在固定的位置了,我百度了很多都没有结果。没想今天又碰到这个问题。
肯定不是因为联合主键之间有什么主从关系才用到ColumnOrder,联合主键之间不存在主从关系,他们都是平等的。
联合主键创建成功,可以看到表设计里面,有两把黄钥匙
联合主键应该说的不全面,可能还有不同表之间的联合主键,这里纯粹只是想制造更多的情况来看看Find方法的执行情况。
然后用Find查询
var stu = ctx.Students4.Find(new object[] { 1, 1 });