【发布时间】:2020-11-29 22:50:11
【问题描述】:
我正在开发一个微服务系统,我在其中跨多个服务复制 Users 和 Tokens。
有时,Token 在它所属的 User 之前收到,我收到错误:
MessageText: insert or update on table "Tokens" violates foreign key constraint "FK_Tokens_User_UserId"
Detail: Key (UserId)=(12) is not present in table "User".
EFCore 中有没有办法与导航属性建立关系,但没有约束 - 所以我可以添加 Token 和一个尚不存在的 Id 作为外键,这最终会是一致的吗?
这是模型:
代币:
public class Token
{
public long Id { get; set; }
public long? UserId { get; set; }
public virtual User User { get; set; }
}
用户:
public class User
{
public long Id { get; set; }
public virtual ICollection<Token> Tokens { get; set; }
}
这是 migration.designer.cs 生成外键的部分:
modelBuilder.Entity("Vehicloo.NoticeboardService.Database.Models.Token", b =>
{
b.HasOne("Vehicloo.NoticeboardService.Database.Models.User", "User")
.WithMany("Tokens")
.HasForeignKey("UserId");
b.Navigation("User");
});
【问题讨论】:
-
请edit您的问题包括您定义的EF实体。当您从数据库中删除外键时,您的代码是否有效?
-
@Progman 我的代码工作正常。正如我在帖子中所说:我正在添加外键
UserId等于12-User的令牌,而Id当时不存在。我要做的是删除外键约束。 -
如果你想在
UserId列中添加一个值12,但是它被设置为User的外键并且没有这样的行,那么你必须删除外键或添加具有该 ID 的User行。关于外键违规的错误消息来自 PostgreSQL,而不是来自实体框架。 -
@Progman 是的,但是外键是由 EFCore 创建的。再一次 - 正如我在帖子中所说:'EFCore 中有没有办法与导航属性建立关系,但没有约束'。
-
请edit您的问题包括通过 EFCore 创建外键的代码。
标签: asp.net-core entity-framework-core