【问题标题】:EF Core - create relation between two models without a foreign key constaintEF Core - 在没有外键约束的两个模型之间创建关系
【发布时间】:2020-11-29 22:50:11
【问题描述】:

我正在开发一个微服务系统,我在其中跨多个服务复制 UsersTokens

有时,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


【解决方案1】:

只需删除行:

public virtual ICollection<Token> Tokens { get; set; }

来自User 和这一行:

public virtual User User { get; set; }

来自Token。这告诉EF不要为用户令牌创建任何外键。因此,Token 表中的UserId 列将不受任何约束。

对于查询,您可以手动连接两个表。

【讨论】:

  • 我正在尝试保持导航属性正常工作 - 它们对我的 API 至关重要,因为我使用 HotChocolate 库并利用它们来获取相关模型(它无法自行执行连接) .
  • @JCode,除了强制约束导航或根本没有导航之外,恐怕您别无选择。
  • 或迁移后移除约束...这也很乏味。
猜你喜欢
  • 2020-10-03
  • 2021-06-24
  • 2018-06-20
  • 1970-01-01
  • 1970-01-01
  • 2021-03-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-14
相关资源
最近更新 更多