簡體   English   中英

EF核心:使用鏈接屬性為組合PK的一部分定義外鍵

[英]EF Core: Define foreign key for part of a composite PK using a chained property

我有以下模型:

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具有定義的復合PK,它由( InstanceIdDatabaseNameSchemaName )組成。

我想定義一個從schema.InstanceIdinstance.Id的外鍵。 我已經試過了:

        modelBuilder.Entity<SchemaEfEntity>()
            .HasOne(c => c.Database.Instance)
            .WithMany()
            .HasForeignKey(
                $"{nameof(SchemaEfEntity.Database)}{nameof(DatabaseEfEntity.Instance)}{nameof(InstanceEfEntity.Id)}"
            );

但是在創建遷移時出現以下錯誤:

表達式“ c => c.Database.Instance”不是有效的屬性表達式。 該表達式應表示一個簡單的屬性訪問:“ t => t.MyProperty”。 參數名稱:propertyAccessExpression

有任何想法嗎? 有可能嗎? 有沒有辦法手動指定它,即不使用屬性鏈而是僅將表和列指定為純文本?

可以使用以下語法來完成:

modelBuilder.Entity<SchemaEfEntity>()
    .HasOne(typeof(InstanceEfEntity))
    .WithMany()
    .HasForeignKey(
        $"{nameof(SchemaEfEntity.Database)}{nameof(DatabaseEfEntity.Instance)}{nameof(InstanceEfEntity.Id)}")
    .OnDelete(DeleteBehavior.Restrict);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM