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

我有以下模型:


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


有任何想法吗?有可能吗?有没有办法“手动”指定它,即不使用属性链而只是将表和列指定为纯文本?


Smart猫小萌
浏览 78回答 1
1回答

哆啦的时光机

可以使用以下语法完成:modelBuilder.Entity<SchemaEfEntity>()&nbsp; &nbsp; .HasOne(typeof(InstanceEfEntity))&nbsp; &nbsp; .WithMany()&nbsp; &nbsp; .HasForeignKey(&nbsp; &nbsp; &nbsp; &nbsp; $"{nameof(SchemaEfEntity.Database)}{nameof(DatabaseEfEntity.Instance)}{nameof(InstanceEfEntity.Id)}")&nbsp; &nbsp; .OnDelete(DeleteBehavior.Restrict);
打开App,查看更多内容
随时随地看视频慕课网APP