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 });

 

posted @ 2019-02-23 22:59  张四海  阅读(402)  评论(0编辑  收藏  举报