[英]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.