• 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 });
  • 相关阅读:
    vsftp搭建
    进程管理相关命令(15 个)
    系统管理与性能监视命令 (9 个)
    系统权限及用户授权相关命令(4 个)
    用户管理命令(10个命令)
    深入网络操作命令(9条命令)
    查看系统用户登陆信息的命令(7 个)
    查看文件及内容处理命令(21个命令)
    有关磁盘与文件系统的命令(16个命令)
    linux kernel bisops.h
  • 原文地址:https://www.cnblogs.com/jinshan-go/p/10424764.html
Copyright © 2020-2023  润新知