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

EF Core:使用链式属性为复合 PK 的一部分定义外键

EF Core:使用链式属性为复合 PK 的一部分定义外键

C#
Smart猫小萌 2022-12-31 12:48:20
我有以下模型:internal class SchemaEfEntity{    [Required]    [MaxLength(128)]    public string Name { get; set; }    [Required]    public DatabaseEfEntity Database { get; set; }}internal class DatabaseEfEntity{    [Required]    public string Name { get; set; }    [Required]    public InstanceEfEntity Instance { get; set; }    public ICollection<SchemaEfEntity> Schemas { get; set; }}internal class InstanceEfEntity : IEfIdEntity{    public long Id { get; set; }    [Required]    public string Name { get; set; }    public ICollection<DatabaseEfEntity> Databases { get; set; }}public sealed class MyDbContext : DbContext{        internal DbSet<InstanceEfEntity> Instances { get; set; }        internal DbSet<DatabaseEfEntity> Databases { get; set; }        internal DbSet<SchemaEfEntity> Schemas { get; set; }        protected override void OnModelCreating(ModelBuilder modelBuilder)        {            modelBuilder.Entity<InstanceEfEntity>().HasKey(x => x.Id);            modelBuilder.Entity<InstanceEfEntity>().HasIndex(x => x.Name).IsUnique();            modelBuilder.Entity<DatabaseEfEntity>().HasKey(                $"{nameof(DatabaseEfEntity.Instance)}{nameof(InstanceEfEntity.Id)}",                $"{nameof(DatabaseEfEntity.Name)}");            modelBuilder.Entity<SchemaEfEntity>().HasKey(                $"{nameof(SchemaEfEntity.Database)}{nameof(DatabaseEfEntity.Instance)}{nameof(InstanceEfEntity.Id)}",                $"{nameof(SchemaEfEntity.Database)}{nameof(DatabaseEfEntity.Name)}",                $"{nameof(SchemaEfEntity.Name)}");        }}SchemaEfEntity定义了一个由 ( InstanceId,DatabaseName和SchemaName)组成的复合 PK。但是在创建迁移时出现以下错误:表达式“c => c.Database.Instance”不是有效的属性表达式。该表达式应表示一个简单的属性访问:'t => t.MyProperty'。参数名称:propertyAccessExpression有任何想法吗?有可能吗?有没有办法“手动”指定它,即不使用属性链而只是将表和列指定为纯文本?
查看完整描述

1 回答

?
哆啦的时光机

TA贡献1779条经验 获得超6个赞

可以使用以下语法完成:


modelBuilder.Entity<SchemaEfEntity>()

    .HasOne(typeof(InstanceEfEntity))

    .WithMany()

    .HasForeignKey(

        $"{nameof(SchemaEfEntity.Database)}{nameof(DatabaseEfEntity.Instance)}{nameof(InstanceEfEntity.Id)}")

    .OnDelete(DeleteBehavior.Restrict);


查看完整回答
反对 回复 2022-12-31
  • 1 回答
  • 0 关注
  • 77 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号