[英]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,它由( InstanceId
, DatabaseName
和SchemaName
)組成。
我想定義一個從schema.InstanceId
到instance.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.