asp.net-core - EF Core - 在没有外键约束的两个模型之间创建关系
问题描述
我正在开发一个微服务系统,我在其中复制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");
});
解决方案
只需删除行:
public virtual ICollection<Token> Tokens { get; set; }
从这User
一行开始:
public virtual User User { get; set; }
从Token
. 这告诉EF
不要为用户令牌创建任何外键。因此,您将UserId
在Token
表中拥有不受任何约束的列。
对于查询,您可以手动连接两个表。
推荐阅读
- reactjs - Semantic UI React 更改默认字体
- javafx - 有没有办法在 TabPane 的 TabControlButtons 的右侧添加按钮?
- php - 转换为 JSON 格式 PHP
- javascript - 如何使用输入类型文本创建 html 代码(或其他代码)
- javascript - 带有弹出窗口的(多边形形状)图层顶部带有弹出窗口的 Mapbox 标记显示 2 个弹出窗口
- javascript - 非常慢的交互与大量数据负载
- javascript - 比较Mongo中的两个参考?
- python - Python调用类函数而不引用类名
- python - 格式化 Python 列表
- javascript - 在反应js中将经纬度作为道具传递的最佳方法