继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

EF Core3.0 创建联合唯一索引、外键和条件索引

吉士粉i里脊
关注TA
已关注
手记 4
粉丝 1
获赞 0

1、DbContext创建联合唯一索引和外键

modelBuilder.Entity<MemberValueCard>(b =>
{
    b.OwnsOne(v => v.CardInfo);  //关联实体
    
    b.HasMany(v => v.MemberValueCardRecord)   
     .WithOne() 
     .HasForeignKey(nameof(MemberValueCardRecord.MemberCardId));  //创建外键
     
    b.HasIndex(v => new {v.VenueId,v.MemberId})
     .IsUnique();  //创建VenueId和MemberId的联合唯一索引
}

因为EF Core3.0不支持创建值对象的联合唯一索引,只能在Migrations中的UP函数中手写。

migrationBuilder.CreateIndex(
    name: "IX_MemberValueCards_VenueId_CardInfo_Id",
    table: "MemberValueCards",
    columns: new[] { "VenueId", "CardInfo_Id" },
    unique: true
);

解释:将MemberValueCard中的VenueId和CardInfo中的Id创建联合唯一索引


2、条件索引

我用的mysql版本是8.0.21,老版本不一定支持这种写法。

protected override void Up(MigrationBuilder migrationBuilder)       
{       
     migrationBuilder.Sql(@"CREATE UNIQUE INDEX IX_UniqueReferId ON merchanttransfertobankcards   ((CASE WHEN Status not in (8, 16, 32) THEN UniqueReferId END))");      
 }

解释:当status不等于8、16、32时,创建UniqueReferId的唯一索引。


3、条件联合唯一索引

CREATE UNIQUE INDEX IX_Unique_CourseId_Type_UserId ON orders (	
 ( CASE WHEN `Status` = 1 THEN CourseInfo_Id END ),	
 ( CASE WHEN `Status` = 1 THEN Sku_Type END ),
 ( CASE WHEN `Status` = 1 THEN User_UserId END )
 );

解释:当订单(order)状态(status)为1时,创建(CourseInfo_Id,Sku_Type,User_UserId)的联合唯一索引


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP