簡體   English   中英

EF Core中的0-1自引用關系

[英]0-1 self referencing relationship in EF Core

想法:我有一個Key實體,可以被其他Key替換(輪換)延遲。 我想把它實現為:

class Key {
    string Id;
    string ReplacesId;
    Key Replaces;
    string ReplacedById;
    Key ReplacedBy;
    DateTime Expires;
    // ...
}

因此,當我想要替換它時,我會創建另一個鍵,然后互相引用新舊鍵。 如果刪除其中任何一個,那么另一個也會被刪除。

這就是我實現的方式,使用這個Fluent映射:

modelBuilder.Entity<Key>().HasOne(x => x.ReplacedBy)
            .WithOne(x => x.Replaces)
            .IsRequired(false)
            .OnDelete(DeleteBehavior.Cascade);

替換邏輯:

oldKey.ReplacedBy = newKey;
oldKey.ReplacedById = newKey.Id;
newKey.Replaces = oldKey;
newKey.ReplacesId = oldKey.Id;

_dbContext.Keys.Update(newKey);
_dbContext.Keys.Update(oldKey);

await _dbContext.SaveChangesAsync();

但似乎ReplacedById ReplacesId或者其中一個被用作常規字段而不是FK,因為當我嘗試刪除其中一個時,它們不會級聯。

我可以做這項工作,還是應該引入Rotations/Replacements表?

但似乎ReplacedById ReplacesId或者其中一個被用作常規字段而不是FK,因為當我嘗試刪除其中一個時,它們不會級聯。

這是因為您的Fluent API配置沒有以正確的方式完成。 它實際上應該如下:

modelBuilder.Entity<Key>().HasOne(k => k.Replaces)
                          .WithOne()
                          .HasForeignKey<Key>(k => k.ReplacesId)
                          .IsRequired(false);

modelBuilder.Entity<Key>().HasOne(k => k.ReplacedBy)
                          .WithOne()
                          .HasForeignKey<Key>(k => k.ReplacedById)
                          .IsRequired(false);

現在一切都會按預期生成並運作!

注意:它將生成onDelete: ReferentialAction.Restrict因為它們不能在它們之間級聯,因為它會導致多個級聯路徑。

暫無
暫無

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

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