gpt4 book ai didi

c# - EF Core中的0-1自引用关系

转载 作者:行者123 更新时间:2023-11-30 12:19:52 27 4
gpt4 key购买 nike

想法:我有一个 Key 实体,它可以被其他 Key 延迟替换(轮换)。我正在考虑将其实现为:

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

因此,当我想替换它时,我会创建另一个 key ,然后将新旧 key 相互引用。如果其中任何一个被删除,另一个也会被删除。

这就是我使用 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 表?

最佳答案

But it seems that ReplacedById ReplacesId or one of them are used like regular fields ant not FK, because when I try to delete one of them, they don't cascade.

这是因为您的 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,因为你不能在它们之间级联,因为它会导致多个级联路径。

关于c# - EF Core中的0-1自引用关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54698650/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com