为了账号安全,请及时绑定邮箱和手机立即绑定

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

标签:
MySQL C# .NET

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)的联合唯一索引


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消